[Effective Java] 7 - item44 표준 항수형 인터페이스를 사용하라
만일 필요한 용도에 맞는 표준 함수형 인터페이스가 존재한다면, 직접 구현하는 것보다는 이를 활용하는 것이 좋다.
기본 함수형 인터페이스
표준 함수형 인터페이스는 java.util.function
패키지 이하에 존재하며, 총 44개의 인터페이스가 담겨 있고 기본이 되는 인터페이스 6가지가 존재한다.
인터페이스 | 함수 시그니처 | 의미 | 예 |
---|---|---|---|
UnaryOperator<T> |
T apply(T t) |
반환 값과 인수의 타입이 같은 함수 인수 1개 |
String::toLowerCase |
BinaryOperator<T> |
T apply(T t1, T t2) |
반환 값과 인수의 타입이 같은 함수 인수 2개 |
BigInteger::add |
Predicate<T> |
boolean test(T t) |
인수 하나를 받아 boolean 을 반환하는 함수 |
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 |
위의 인터페이스만 기억하면, 나머지 인터페이스도 유추하여 사용이 가능하다.
또한, 표준 함수형 인터페이스는 기본 타입만 지원한다. 그러나 박싱된 기본 타입을 사용한다면 연산 성능이 나빠질 것이므로 유의하자.
직접 전용 함수형 인터페이스를 구현해야 하는 경우
보통은 표준 함수형 인터페이스를 사용하는 것이 가장 좋은 선택이지만, 다음 조건 중 한가지 이상을 만족하는 경우, 직접 구현하는 것을 고려할 수 있다.
- 자주 쓰이며, 이름 자체가 용도를 영확히 설명해준다.
- 반드시 따라야 하는 규약이 있다.
- 유용한 디폴트 메서드를 제공할 수 있다.
또한, 직접 만든 함수형 인터페이스에는 @FunctionalInterface
애너테이션을 사용하자.
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
...
}
이 애너테이션을 사용하면,
- 구현한 인터페이스의 의도를 적확하게 명시할 수 있다.
- 해당 인터페이스가 함수형 인터페이스의 정의를 위반하지 않도록 사후 관리가 가능하다.
Leave a comment