#44 표준 함수형 인터페이스를 사용하라
표준 함수형 인터페이스를 사용해야 하는 이유에 대해 알아보겠습니다.
LinkedHashMap 클래스의 removeEldestEntry(Map.Entry<K, V> eldest) 메서드를 통해 알아보겠습니다.
LinkedHashMap은 순서를 보장하는 HashMap으로, 가장 오래된 원소를 제거할 때 removeEldestEntry(...) 메서드의 반환 값을 보고 판단합니다.
유지해야 하는 가장 최근 원소 개수를 지정하려면, 위처럼 생성자를 통해 값을 지정하거나 별도의 메서드를 통해야 합니다.
함수형 인터페이스를 통해 구현할 수 도 있습니다.
굳이 직접 함수형 인터페이스를 만들지 않아도, 표준 함수형 인터페이스를 통해 구현할 수 있습니다.
EldestEntryRemovalFunction 인터페이스 대신, BiPredicate 인터페이스를 이용할 수 있습니다.
이미 표준이기 때문에 쓰는 입장에서도 편하고, 표준 함수형 인터페이스 내부에 Default 메서드가 많이 있기 때문에 좀 더 유용합니다.
java.util.function 패키지에는 총 43개의 표준 함수형 인터페이스들이 있습니다.
인터페이스들에 대한 설명은 아래 링크를 참고하기 바랍니다.
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
앞선 내용에 반하지만, 커스텀한 함수형 인터페이스를 만들어야 하는 경우들도 있습니다.
예를 들어 인수를 3개 이상, 여러 개 받는다던가 내부적으로 다른 처리가 필요한 경우가 있습니다.
그런데 구조적으로 같은 표준 함수형 인터페이스가 있지만 커스텀하게 만들어야 하는 경우도 있습니다.
Comparator 인터페이스와 ToIntBiFunction 인터페이스는 구조적으로 같습니다.
하지만 Comparator 인터페이스가 필요한 이유가 있습니다.
자주 쓰이며, 이름 자체가 용도를 명확히 설명해준다. (Comparator는 '비교자'라는 의미를 가진다.)
반드시 따라야 하는 규약이 있다. (각 인스턴스를 비교해야 한다.)
유용한 Default 메서드를 제공할 수 있다. (reverse, thenComparing 등)
@FunctionalInterface annotation
함수형 인터페이스에는 @FunctionalInterface annotation을 달아야 합니다.
함수형 인터페이스는 하나의 추상 메서드만 가져야 하기 때문에, 이 어노테이션을 달아두면 나중에 유지보수 과정에서 실수로 추상 메서드를 추가하는 일을 방지할 수 있습니다.
입력값과 반환 값에 함수형 인터페이스 타입을 이용할 수 있습니다.
함수형 인터페이스 타입을 이용하는 게 익숙하진 않지만, 람다식을 활용할 수 있어서 코드가 좀 더 간결해지는 거 같네요.
게다가 인터페이스내 Default 함수도 있기 때문에 좀 더 활용 범위가 넓어지는 거 같습니다.