자바에서 람다식은 익명함수? 익명객체!

장서연·2022년 1월 17일
0

람다식은 익명 함수가 아니라 익명 객체이다

자바에서 람다식은 익명함수가 아니다. 익명 객체이다. 자바에서는 함수가 혼자 존재할 수 없기 때문이다.

아래의 두 코드는 같다.

(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로는 람다를 다룰 수 없다. 그래서 나온 것이 함수형 인터페이스!

자바에서 메서드는 무조건 객체 안에 있어야 한다. 그래서, 위에서 Object 클래스 안에 익명 객체로 살포시 넣어주었으나, 사용이 불가능했다. 이 한계를 극복하고자, 함수형 인터페이스가 등장했다.

0개의 댓글