기록이 힘이다.

[이펙티브 자바]아이템44 표준 함수형 인터페이스를 사용하라 본문

JAVA

[이펙티브 자바]아이템44 표준 함수형 인터페이스를 사용하라

dev22 2023. 4. 7. 21:19
728x90

필요한 용도에 맞는게 있다면, 직접 구현하지 말고 표준 함수형 인터페이스를 활용하라.

그러면 API가 다루는 개념의 수가 줄어들어 익히기 더 쉬워진다. 또한 표준 함수형 인터페이스들은 유용한 디폴트 메서드를 많이 제공하므로 다른 코드와의 상호운용성도 크게 좋아질 것이다.

java.util.function 패키지에는 총 43개의 인터페이스가 담겨 있다. 이 중 개본 인터페이스 6개만 기억하면 나머지는 충분히 유추해낼 수 있다.

기본 인터페이스는 기본 타입인 int, long, double용으로 각 3개씩 변형이 생겨난다.

인터페이스 함수 시그니처 예

UnaryOperator<T> T apply(T t) String::toLowerCase
BinaryOperator<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

표준 함수형 인터페이스 대부분은 기본 타입만 지원한다. 그렇다고 기본 함수형 인터페이스에 박싱된 기본 타입을 넣어 사용하지는 말자.

Comparator 특성을 정리하면 다음의 세 가지 인데, 이 중 하나 이상을 만족한다면 전용 함수형 인터페이스를 구현해야 하는 건 아닌지 진중히 고민해야 한다.

-자주 쓰이며, 이름 자체가 용도를 명확히 설명해준다.

-반드시 따라야 하는 규약이 있다.

-유용한 디폴트 메서드를 제공할 수 있다.

@FunctionalInterface interface EldestEntryRemovalFunction<K,V>{
	boolean remove(Map<K,V> map, Map.Entry<K,V> eldest);
}

@FunctionalInterface 애너테이션이 달려 있음에 주목하자. 프로그래머의 의도를 명시, 세 가지 목적이 있다.

  1. 해당 클래스의 코드나 설명 문서를 읽을 이에게 그 인터페이스가 람다용으로 설계뙨 것임을 알려준다.
  2. 해당 인터페이스가 추상 메서드를 오직 하나만 가지고 있어야 컴파일되게 해준다.
  3. 그 결과 유지보수 과정에서 누군가 실수로 메서드를 추가하지 못하게 막아준다.

직접 만든 함수형 인터페이스에는 항상 @FunctionalInterface 애너테이션을 사용하라.

서로 다른 함수형 인터페이스를 같은 위치의 인수로 사용하는 다중정의를 피해야 한다. 이는 “ 다중정의는 주의해서 사용하라”는 아이템 52의 특수한 예라고 할 수 있다.