자바의 신 2를 정리했습니다.
익명 클래스는 가독성도 떨어지고 불편하다. 이러한 단점을 보완하기 위해서 람다 표현식이 만들어졌다.
대신, 이 표현식은 인터페이스에 메소드가 하나인 것들만 적용 가능하다. 그래서 람다 표현식은 익명 클래스로 전환이 가능하며, 익명 클래스는 람다 표현식으로 전환이 가능하다.
자바에서 메소드가 하나인 인터페이스
- java.lang.Runnable
- java.util.Comparator
- java.io.FileFilter
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
interface Calculate {
int operation(int a, int b);
}
일반적인 인터페이스지만, 이 인터페이스는 Functional(기능적) 인터페이스라고 부를 수 있다. 기능적 인터페이스는 이와 같이 하나의 메소드만 선언되어 있는 것을 의미한다. 그런데, 이렇게만 선언해두면 매우 혼동될 수도 있다. 메소드를 추가하면 컴파일 에러가 난다. 그래서 명시적으로 @FunctionalInterface 라는 어노테이션을 사용하면 이 인터페이스에는 하나의 메소드만 선언할 수 있다.
@FunctionalInterface
interface Calculate {
int operation(int a, int b);
}
익명 클래스로 구현
private void calculateClassic() {
Calculate calculateAdd = new Calculate() {
@Override
public int operation(int a, int b) {
return a + b;
}
};
System.out.println(calculateAdd.operation(1, 2));
}
람다 표현식으로 구현
private void calculateLambda() {
Calculate calculateAdd = (a, b) -> a + b;
System.out.println(calculateAdd.operation(1, 2));
}
Runnable interface 람다 표현식으로 구현
private void runThread() {
new Thread(() -> {
System.out.println(Thread.currentThread().getName());
}).start();
}
run() 메소드에서 처리하는 것이 한 줄이므로 더 간단히 표현 가능
private void runThreadSimple() {
new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
}
- 메소드가 하나만 존재하는 인터페이스는 @FunctionalInterface 로 선언할 수 있으며, 이 인터페이스를 람다 표현식으로 처리할 수 있다.
- (매개 변수 목록) → 처리식으로 람다를 표현하며, 처리식이 한 줄 이상일 때에는 처리식을 중괄호로 묶을 수 있다.
'자바 & 스프링' 카테고리의 다른 글
PreparedStatement 쿼리를 사용하는 이유 (0) | 2021.11.30 |
---|---|
JPA allocationSize default 값이 50인 이유 (0) | 2021.11.30 |
java - thread 동기화 (0) | 2021.11.30 |
java - Stream (0) | 2021.11.30 |
Java 8 Lambda — 2 (0) | 2021.11.30 |