더북(TheBook)

3.4.2 함수형 인터페이스


앞에서 살펴보았듯이 자바에는 Runnable이나 Comparator처럼 액션을 표현하는 인터페이스가 많다. 람다 표현식은 이런 인터페이스와 호환된다.

람다 표현식은 단일 추상 메서드(single abstract method)를 가진 인터페이스(즉, 추상 메서드가 한 개만 있는 인터페이스) 자리에 사용할 수 있다. 이런 인터페이스를 함수형 인터페이스(functional interface)라고 한다.4

함수형 인터페이스로 변환하는 것을 알아보기 위해 Arrays.sort 메서드를 생각해 보자. 이 메서드의 두 번째 매개변수는 Comparator의 인스턴스를 요구한다(Comparator 인터페이스에는 메서드가 하나만 있다). 이 매개변수에 다음과 같은 람다를 전달해 보자.

Arrays.sort(words, (first, second) -> first.length() - second.length());


내부에서 Arrays.sort 메서드의 두 번째 매개변수는 Comparator<String>을 구현한 클래스의 객체를 받는다. 이 객체로 compare 메서드를 호출하면 람다 표현식의 바디가 실행된다. 이런 객체와 클래스를 관리하는 일은 순전히 구현체의 몫이며 고도로 최적화되어 있다.

함수 리터럴을 지원하는 거의 모든 프로그래밍 언어에서 (String, String) -> int처럼 함수 타입을 선언하고, 이 함수 타입으로 변수를 선언한 후 함수를 변수에 저장해 호출할 수 있다. 하지만 자바에서는 이 중 하나만 람다 표현식으로 할 수 있다. 바로 람다 표현식을 함수형 인터페이스 타입 변수에 저장해서 해당 인터페이스의 인스턴스로 변환하는 것이다.


4 혹시라도 오해하지 않도록 덧붙이면, 인터페이스에 기본 메서드나 정적 메서드(자바 8), 비공개 메서드(자바 9)가 여러 개 있다고 해도 추상 메서드가 한 개만 있다면 함수형 인터페이스다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.