자바에서 람다식은 익명함수가 아니다. 익명 객체이다. 자바에서는 함수가 혼자 존재할 수 없기 때문이다.
아래의 두 코드는 같다.
(a, b) -> a>b ? a:b;
위의 람다식과
new Object(){ // 객체의 선언과 생성을 동시에(익명 클래스)
int max(int a, int b) {
return a>b ? a:b;
}
}
위의 익명 객체는 같다.
자바에서는 기본적으로 익명객체로 만들어주었어야했지만, JDK1.8이후부터 람다식을 허용.
중요한 점은, (a, b) -> a>b ? a:b
가 객체라는 것이다.
객체를 다루기 위해 필요한 것이 무엇인가? 바로 참조변수이다.
타입 obj = (a,b) -> a>b? a:b; //어떤 타입?
근데 만약, Object 로 한다면,,,?
Object obj = new Object(){
int max(int a, int b) {
return a>b ? a:b;
}
}
obj.max(3,5); // 에러. Object클래스에 max()가 없음
class Ex14{
public static void main(String[] args){
// Object obj = (a, b) -> a>b? a:b; // 에러. 람다식은 함수형 인터페이스로 다뤄야 함
Object obj = new Object(){
int max(int a, int b) {
return a>b ? a:b;
}
};
obj.max(3,5) // 에러. Object 클래스에 max()가 없기 때문
}
자바에서 메서드는 무조건 객체 안에 있어야 한다. 그래서, 위에서 Object 클래스 안에 익명 객체로 살포시 넣어주었으나, 사용이 불가능했다. 이 한계를 극복하고자, 함수형 인터페이스가 등장했다.