< 람다식 >
람다식 ( = 익명메소드 )
- 메소드를 하나만 가진 인터페이스
- 함수형 인터페이스
- 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 생성하는 방법 예제
- Thread 실행 (=Thread의 start 함수 실행) -> 생성자 안의 run() 메소드 실행
- 자바는 메소드를 매개변수로 전달할 수 없다. 객체만 전달이 가능하다.
- 그렇기 때문에 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
'DevelopmentTools > Java' 카테고리의 다른 글
[java] next(), nextLine() 차이점 (0) | 2023.02.03 |
---|---|
[java] 코딩테스트 문법 정리 (0) | 2022.08.31 |
[programmers-java 중급] 쓰레드(Thread) (0) | 2022.07.21 |
[programmers-java 중급] 어노테이션(Annotation) (0) | 2022.07.18 |
[programmers-java 중급] IO (0) | 2022.07.17 |