함수형 프로그래밍이 떠오르면서 1급 객체(First-class citizen)란 말을 많이 듣게 되는 것 같다. 1급 객체의 특징은 아래와 같다. 아래 1급시민의 3가지 조건을 충족하는 객체라면 1급객체 라고 할수 있다.

1급 시민의 조건 3가지
1. 변수나 데이타에 할당 할 수 있어야 한다.
2. 객체의 인자로 넘길 수 있어야 한다.
3. 객체의 리턴값으로 리턴 할수 있어야 한다.

주로 사용하고 있는 언어인 JAVA에서는, 함수가 1급 객체에 해당하지 않는다. Kotlin, JavaScript 등의 언어에서는 변수에 함수를 할당하고 사용할 수 있다. JAVA는 원래 불가능하지만 JAVA 8 부터는 위 언어들과 같은 1급 객체로의 취급이 가능해진다.

예를 들어
JS는 변수에 함수를 할당 가능

var variable = function func(){
	console.log('hi');
}

그러나 자바는 불가능
BUT 익명 클래스 사용 하여 마치 함수를 넘기는 듯한 역할을 부여할 수 있음

Test test = new Test(){
	System.out.println("hi");
};

또한 Lambda도 마찬가지로 내부적으로 익명 클래스와 같게 처리되므로 Lambda와 익명클래스는 같다고 할 수 있다.

이는 메서드가 1개만 존재하는 인터페이스/클래스를 통해, 마치 함수를 전달하는 것처럼 여겨서, 함수를 1급 객체로 취급하지 않는 JAVA의 단점을 어느정도나마 해결한 것이라고 볼 수 있다.

  • 유의할 점
    Lambda와 익명클래스의 처리방식이 내부적으로 익명을 유지한다는 것이 유사할 뿐 둘이 같은 개념이라고 볼 수 없다.

그렇다면 여기서 파생되는 질문이 하나 있다. 둘의 차이점은 무엇인가?

  • 익명 클래스 VS Lambda
  1. 익명 클래스는 익명의 새로운 클래스를 생성하지만 Lambda는 새로운 메서드를 생성
  2. 익명 클래스의 this는 새로 생성된 클래스 / Lambda의 this는 Lambda를 가진 클래스

0개의 댓글