🎯 모든 예제 소스는 ‣에서 확인할 수 있습니다.
✅ 함수형 인터페이스, 람다, 메서드 참조에 대해 효과적으로 사용하는 방법을 알아본다.
예전에는 자바에서 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스를 사용했다.
이런 인터페이스의 인스턴스를 함수 객체라고 하여, 특정 함수나 동작을 나타내는 데 썼다.
문자열을 길이순으로 정렬하는데, 정렬을 위한 비교 함수로 익명 클래스를 사용하는 예제를 같이 살펴보자.
Collections.sort(words, new Comparator<String>() {
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
전략 패턴처럼, 함수 객체를 사용하는 과거 객체 지향 디자인 패턴에는 익명 클래스면 충분했다.
이 코드에서 Comparator 인터페이스가 정렬을 담당하는 추상 전략을 뜻하며, 문자열을 정렬하는 구체적인 전략을 익명 클래스로 구현했다.
하지만, 익명 클래스 방식은 코드가 너무 길기 때문에 자바는 함수형 프로그래밍에 적합하지 않았다.
자바 8에 와서 추상 메서드 하나짜리 인터페이스는 특별한 의미를 인정받아 특별한 대우를 받게 되었다. 함수형 인터페이스이다.
Collections.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
여기서 람다, 매개변수(s1, s2), 반환 값 타입은 각각 Comparator<String>, String, int지만 코드에는 언급이 없다.
우리 대신 컴파일러가 문맥을 살펴 타입을 추론해준 것이다. 타입 추론 규칙은 자바 언어 명세의 장 하나를 통째로 차지할 만큼 복잡하므로 잘 알지 못한다 해도 상관 없다.