DevelopmentTools/Java

[programmers-java 중급] 람다식(Lambda)

수짱수짱 2022. 7. 21. 04:43

< 람다식 >

람다식 ( = 익명메소드 )

 

  • 메소드를 하나만 가진 인터페이스
    • 함수형 인터페이스
    • ex) Thread 생성할 때 사용하는 Runnable 인터페이스 => run() 메소드 하나만 가짐
public class LamdaExam1 {
	public static void main(String[] args){
    	new Thread(new Runnable() {public void run() {
        	for(int i=0; i<10; i++){
            	System.out.println("hello");
            }
        }}).start();
	}
}

Runnable 을 이용하여 Thread 생성하는 방법 예제

 

  1. Thread 실행 (=Thread의 start 함수 실행) -> 생성자 안의 run() 메소드 실행
  2. 자바는 메소드를 매개변수로 전달할 수 없다. 객체만 전달이 가능하다.
  3. 그렇기 때문에 run() 메소드를 가진 Runnable 객체를 만들어서 전달한다.

=> 메소드를 매개변수로 전달할 수 있다면 매번 객체를 생성해서 전달하지 않아도 된다.

바로 람다표현식으로 가능 !!

 

 public class LambdaExam1 {  
        public static void main(String[] args) {
 		new Thread( ()-> {
            	for(int i=0; i<10; i++){
               		System.out.println("hello");
               	}
            }).start();
        }   
    }

람다식을 이용하여 Thread를 생성하는 방법 예제

 

  • 람다식(=익명메소드) 부분은 어디?
    • () -> { ... }
    • 구현 할 부분을 {} 안에 넣어두면 된다.
  • JVM은 Thread 생성자를 보고 ()->{} 이 무엇인지 대상을 추론
  • Thread 생성자 api를 보면 Runnable 인터페이스를 받아들이는 것을 알 수 있음
  • JVM은 Thread 생성자로 Runnable 인터페이스를 구현한 것이 와야 하는 것을 알게 되고 람다식을 Runnable을 구현하는 객체로 자동으로 만들어서 매개변수로 넣어준다.

< 람다식 기본문법 >

( 매개변수 목록 ) -> { 실행문 }         

: 매우 간단한 문법!

 

예제) 2개의 값을 비교해서 어떤 값이 더 큰지 알아볼 수 있는 인터페이스를 정의하고 이를 이용하는 클래스를 작성해보자.

public interface Compare {  // 2개의 정수를 받아들여서 정수로 반환하는 메소드를 가진 인터페이스
	public int compareTo(int value1, int value2);
}

Compare 인터페이스 정의 예제

 

public class CompareExam{  // Compare 인터페이스를 받아들이고 이용하는 클래스
	
    public static void exec( Compare compare ){ // 실행하는 메소드
	int k = 10;
        int m = 20;
        int value = compare.compareTo(k, m);
        System.out.println(value);
	}
    
	public static void main(String[] args){
    	// 메소드를 실행하는 실행문을 main에 작성
        exec( (i,j)-> {
        	return i - j; // 음수가 나오면 j가 큼. 양수가 나오면 i가 큼. 0이면 같은 값.
        }); 
    }
}

 Compare 인터페이스를 사용하는 클래스 예제

* compareTo메소드가 구현된 방법 (return i-j 부분)에 따라 결과값이 달라짐

 

1. JVM은 exec 메소드를 찾고

2. 매개변수 2개를 받아들이는 인터페이스를 받아들이는 메소드를 찾는다

3. 해당 인터페이스가 Compare 인터페이스를 받아들이는 exec 메소드가 알맞은 것임을 알 수 있음

4. JVM은 이 람다식을 Compare를 구현하는 익명객체로 만들어서 exec 메소드에 전달 

 

 

 

자바는 메소드를 인자로 전달하려면 반드시 객체를 만들어서 전달해야 했다.

java8부터는 람다식이 생기면서, 마치 메소드만 전달 하는 것 처럼 간편하게 문법을 사용할 수 있게 되었다.


강의 출처 : https://school.programmers.co.kr/learn/courses/9/lessons/280