728x90
핵심만 쏙쏙..
불필요한 함수형 인터페이스를 직접 구현해 사용하지 말고, 대신 표준형 함수형 인터페이스를 사용하라.
왜?
- 자바 표준 라이브러리에 이미 같은 모양의 인터페이스가 있을 것이다.
- 필요한 용도에 맞는 인터페이스가 있는지 먼저 확인해라.
- 심지어, 표준 함수형 인터페이스들은 유용한 디폴트 메서드도 많이 제공한다.
- 이는 다른 코드와의 상호 운용성도 높인다.
java.util.function 패키지의 인터페이스 43가지!
다 기억하긴 어렵고, 기본 인터페이스 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 |
- 기본 인터페이스는 기본 타입인 int, long, double용으로 3개씩 변형이 생긴다. (이름은 기본 인터페이스 이름 앞에 해당 기본 타입 이름이 붙어 지어짐. ex) Predicate -> IntPredicate ...)
- * 유일하게 function의 변형만(반환 타입만) 매개변수화 됐다. (LongFunction<int[]>는 long을 받아 int[]를 반환한다.)
- Function 인터페이스의 변형은 따라서 입력, 결과 타입이 항상 다르다.
- 입력과 결과 타입이 모두 기본 타입이면 접두어로 SrcToResult를 사용한다. (LongToIntFunction)
- 입력이 객체 참조이고 결과가 int/long/double인 애들은 ToResult를 사용한다. (ToLongFunction<int[]> : int[]받아 long반환)
- 기본 함수형 인터페이스 중 인수를 2개씩 받는 변형도 있다.
- boolean을 반환하도록 하는 Supplier 인터페이스의 변형도 존재한다. (이름에 boolean이 들어가는 것 뿐, 다른 인터페이스도 boolean 값을 반환할 수 있다.)
이정도만 알아둬보자.
표준 함수형 인터페이스는 대부분 기본 타입만 지원된다.
그렇다고 기본 함수형 인터페이스에 박싱된 기본 타입을 넣어 사용하면 안된다.
왜?
item61에서 배운다. 게다가 성능도 매우 낮아진다고 한다.
Q. 그럼 언제나 표준 함수형 인터페이스만 사용해야 할까?
A.
아니!
1. 표준 인터페이스 중 필요한 용도에 맞는게 없는 경우
2. 자주 쓰이며, 이름 자체가 용도를 명확히 설명해주는 경우
3. 반드시 따라야하는 규약이 있는 경우
4. 유용한 디폴트 메서드를 듬뿍~ 제공할 수 있는 경우
에는 인터페이스를 직접 작성하는 것이 좋다.
-> 인터페이스를 직접 작성한다? 그렇다면 주의할 점이 있다.
- 직접 만든 함수형 인터페이스에는 항상 @FunctionalInterface 애너테이션을 사용하라.
+ 추가 주의 사항
- 서로 다른 함수형 인터페이스를 같은 위치의 인수로 받는 메서드들을 다중 정의해서는 안된다.
public interface ExecutorService extends Executor {
<T> Future<T> submit(Callback<T> task);
Future<?> submit(Runnable task);
}
메서드를 사용할 때마다 형변환을 해야하는 경우가 많다고 한다.
왕왕 문제가 생기니 꼭 주의해서 사용하자.
핵심 정리
위에서 언급한 특별한 예외 사항 4가지 경우가 아니라면,
java.util.function 패키지의 표준 함수형 인터페이스를 사용하자.
728x90
'JAVA > Effective Java' 카테고리의 다른 글
item 46. 스트림에서는 부작용 없는 함수를 사용하라 (0) | 2022.07.02 |
---|---|
item 45. 스트림은 주의해서 사용하라. (0) | 2022.06.18 |
item 43. 람다보다는 메서드 참조를 사용하라 (0) | 2022.06.17 |
item 42. 익명 클래스보다는 람다를 사용하라 (0) | 2022.06.14 |
item 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 (0) | 2022.06.14 |
댓글