[Java in Action] 람다, 함수형 인터페이스, 메서드 레퍼런스

728x90
반응형
SMALL

람다

람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이다.


// 익명 함수
Comparator<Apple> byWeight = new Comparator<Apple>() {
    public int compare(Apple a1, Apple a2) {
		return a1.getWeight().compareTo(a2.getWeight());
    }
}

// 람다
Comparator<Apple> byWeight = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());

 

함수형 인터페이스

오직 하나의 추상 메서드만 지정하는 인터페이스이다. (디폴트 메서드 제외)

 

@FunctionalInterface 어노테이션으로 함수형 인터페이스임을 명시한다.

Java 8 Functional Interface

함수 디스크립터

함수형 인터페이스의 추상 메서드 시그니처는 람다 표현식의 시그니처를 가리킨다.

 

람다 표현식의 시그니처를 서술하는 메서드를 함수 디스크립터라고 한다.

 

예를 들어 Runnable 인터페이스의 추상 메서드 run()은 인수와 반환 값이 없다.

 

즉, Runnable 인터페이스는 인수와 반환값이 없는 시그니처다.

 

 

메서드 레퍼런스

특정 메서드만을 호출하는 람다의 축약형이다.

 

메서드 레퍼런스를 이용하면 기존의 메서드 정의를 재활용해서 람다처럼 전달할 수 있다.

 

또한, 명시적으로 메서드 명을 참조하기에 가독성을 높일 수 있다.

 
// 람다
(Apple apple) -> apple.getWeight()

// 메서드 레퍼런스
Apple::getWeight

 

정리

처음 람다를 접했을때는 ()??? -> ?? 코드에 뭔 화살표가 있지.. 정말 낯설었다.

 

하지만, 익혀보니 확실히 간결하고 가독성이 좋다.

 

람다 시그니처, 함수 디스크립터는 깊게는 잘 모르겠지만 그냥 아~하고 넘어가도 될 듯하다.

728x90
반응형
LIST