brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Jan 28. 2019

Effective Java3/E - 람다와 스트림

#42 익명 클래스보다는 람다를 사용하라

Effective Java 3/E - 람다와 스트림


#42 익명 클래스보다는 람다를 사용하라


#01 익명 클래스를 이용한 함수 객체 정의 (Java 8 이전)


Java 8 이전에는 하나의 추상 메서드만 담은 인터페이스나 추상 클래스를 함수 타입이라 표현했습니다.

함수 타입을 인스턴스화 하면 함수 객체가 되고, 이를 익명 클래스를 통해서 구현할 수 있습니다.




#02 람다를 이용한 함수형 인터페이스 정의 (Java 8 이후)


Java 8에서는 하나의 추상 메서드만 담은 인터페이스를 함수형 인터페이스라 부르고 있습니다.

그리고 이 함수형 인터페이스 인스턴스를 람다식(lambda expression)을 통해 구현할 수 있습니다.


익명 클래스가 아닌, 람다를 이용했을 때 장점에 대해 알아보겠습니다.




#01 람다 장점


#03 익명 클래스 & 람다


'Collections.sort(List<T> list,  Comparator<? super T> c)' 메서드를 구현하기 위해서는 'Comparator' 함수형 인터페이스 인스턴스가 필요합니다.


이를 위해 익명 클래스와 람다를 이용해서 함수형 인터페이스 인스턴스를 구현할 수 있습니다.

람다를 통해 구현하면 익명 클래스보다 코드가 좀 더 간결해집니다.

이 외에도 다른 방법으로 좀 더 코드를 간결하게 할 수 도 있는데, 이는 추후에 다루겠습니다.


람다식에서 함수형 인터페이스 인스턴스(Comparator interface), 반환 값의 타입(int), 매개 변수 타입(String, String)을 생략할 수 있습니다.


하지만 타입을 명시해야 코드가 더 명확할 때에는 아래처럼 타입을 명시할 수 있습니다.

#04 타입을 명시한 람다




#02 람다 단점


람다는 메서드나 클래스와 달리 이름이 없고, 문서화 할 수 없습니다.

따라서 코드가 복잡하거나 길어지면, 오히려 람다가 가독성이 더 떨어질 수 있습니다.


그리고 아래와 같이 익명 클래스의 this 키워드는 익명 클래스 인스턴스 자신을 나타내지만, 람다의 this 키워드는 바깥 인스턴스를 나타냅니다.

따라서 자기 자신을 참조해야 한다면 람다를 쓸 수 없습니다.


#05 this 키워드
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari