함수형 인터페이스
- 람다식이 메서드와 동등한 것처럼 보였지만 람다식은 익명 클래스의 객체와 동등하다.
(int a, int b) -> a > b ? a : b
<=>
new Object() {
int max(int a, int b) -> {
return a > b ? a : b;
}
}
- 위의 코드에서 메서드 이름 max는 임의로 붙인 것이고 의미는 없다. 람다식으로 정의한 익명 객체 메서드를 어떻게 호출 할 수 있을까
- 참조 변수가 있어야 객체의 메서드를 호출 할 수 있다.
타입 f = (int a, int b) -> a > b ? a : b;
- 타입은 참조형이기 때문에 인터페이스 혹은 클래스만 가능하다.
- 그리고 람다식과 동등한 메서드가 정의되어 있는 것이어야 한다.
interface MyFunction {
public abstract int max(int a, int b);
}
MyFunction f = new Function() {
public int max(int a, int b) {
return a > b ? a : b;
}
};
int big = f.max(5, 3); // 익명 객체의 메서드를 호출
- MyFunction interface에 정의된 max() 라는 메서드가 람다식의 메서드의 선언부와 일치하기 때문에 익명 객체를 람다식으로 대체할 수 있다.
- MyFunction 인터페이스를 구현한 익명 객체를 람다식으로 가능한 이유는
- 람다식도 익명 객체이고
- MyFunction 인터페이스를 구현한 익명 객체의 메서드 max()와 람다식의 매개변수의 타입과 개수 그리고 반환값이 일치하기 때문이다.
MyFunciont f = (int a, int b) -> a > b ? a : b; // 익명 객체를 람다식으로 대체
int big = f.max(5, 3); // 익명 객체의 메서드 호출
- 람다식으로 다루기 위한 인터페이스를 함수형 인터페이스 라고 부른다.
- 함수형 인터페이스는 오직 하나의 추상 메서드만 정의되어 있어야한다. (static메서드와 default메서드의 개수는 제약 없다.)
@FunctionalInterface
interface MyFunction {
public abstract int max(int a, int b);
}
- 인터페이스 메서드 구현을 람다로 간단하게 처리 할 수 있게되었다.