Search

Item 44. 표준 함수형 인터페이스를 사용하라

생성일
2023/07/31 02:28
챕터
7장 - 람다와 스트림

표준 함수형 인터페이스

아래와 같이 매개변수를 받아 문자열의 길이를 비교하는 메서드가 아래처럼 있다.
boolean checkLength(String s1, String s2) { return s1.length() > s2.length(); }
Java
복사
이런 메서드는 람다를 활용하기 위해 함수형 인터페이스로 표현할 수 있다.
@FunctionalInterface interface ICheckLength { boolean checkLength(String s1, String s2); } ICheckLength result = (s1, s2) -> s1.length() > s2.length();
Java
복사
하지만 사실 이런 인터페이스는 자바 표준 라이브러리에 이미 준비되어있기 때문에, 직접 구현할 필요가 없다.
BinaryPredicate<String> result = (s1, s2) -> s1.length() > s2.length();
Java
복사
이렇게 자바 표준 라이버리에 이미 준비되어 있는 함수형 인터페이스들을 표준 함수형 인터페이스 혹은 표준 함수형 인터페이스 API라고 부른다.

기본 함수형 인터페이스

인터페이스
함수 시그니처
UnaryOpeator<T>
T apply(T t)
String::toLowerCase
BinaryOpeator<T>
T apply(T t1, T t2)
BigInteger::add
Predicate<T>
boolean test(T t)
Collection::isEmpty
Function<T, R>
R apply(T t)
Arrays::asList
Supplier<T>
T get()
Instant::now
Consumer<T>
void accept(T t)
System.out::println
위의 예시들에 더해 기본 함수형 인터페이스의 전체 개수는 43개이다. 다 외우기에 수가 많고 규칙성이 부족하기 때문에, 필요할 때 찾아서 사용하자.
또한 사용할 때 Long이나 Integer와 같은 박싱된 기본 타입을 사용하는 것은 계산량이 많을 때 성능이 굉장히 느려지므로 추천되지 않는다.

전용 함수 인터페이스의 구현을 고려하기

Comparator<T>의 경우에는 ToIntBiFunction<T, U>가 있지만 별도의 인터페이스로 존재한다. 그 이유는 Comparator API는 굉장히 자주 사용되고, 그 이름에서 용도와 목적을 명확히 설명 해준다. 또한 구현하는 쪽에서 지켜야 하는 규약을 포함하고 있으며, 비교자들을 활용할 수 있는 여러 유용한 디폴트 메서드를 제공하기 때문이다.
이처럼 아래의 3 가지 조건 중 하나 이상을 만족한다면 별도의 전용 함수 인터페이스를 구현하는 것을 고려해보는 것이 좋다.
자주 사용되며, 이름 자체로 용도를 명확히 설명할 수 있다.
해당 함수형 인터페이스를 사용할 때, 반드시 지켜져야하는 규약이 있다.
유용한 디폴트 메서드를 제공할 수 있다.
이렇게 별도의 함수형 인터페이스를 구현하기를 선택했다면, @FunctionalInterface 애노테이션을 사용하자.
해당 클래스의 코드나 설명이 필요한 사람에게 해당 인터페이스가 람다를 위한 함수형 인터페이스임을 명확히 할 수 있다.
또한 컴파일 타임에 확인하여 해당 인터페이스가 추상 메서드를 오직 한 개만 가지고 있도록 보장해준다.