Item 44 : 표준 함수형 인터페이스를 사용하라
템플릿 메소드 부터 알아보고 가겠다.
템플릿 메소드 패턴은 자바 디자인 패턴 중 하나이며 소스코드상의 알고리즘에서
특정 환경 또는 상황에 맞게 확장 또는 변경을 해야 할 경우 매우 유용한 패턴이다.
이름을 모르더라도 객체 지향적으로 개발하다보면 무의식적으로 만들게 되는 패턴이다.
추상클래스에 기본틀을 만들고 확장을 통해 추가로 구현해야 할 기능을 정의하는 방식이다.
예를 들어 DB와 연동하기 위한 DB 설정 class를 만들고 mysql이나 oracle에 따라
추가적인 기능을 추가하는 것도 템플릿 메소드 패턴의 예시이다.
자바가 람다를 지원하면서 이 템플릿 메소드 패턴의 매력이 줄어들었는데
같은 효과의 함수 객체를 받는 정적 팩토리나 생성자를 제공하면서 이를 대체할 수 있기 때문이다.
이 경우 함수 객체를 매개변수로 받는 생성자와 메소드를 더 많이 만들어야 하고 함수형 매개변수 타입을 올바르게 선택해야한다.
LinkedHasMap의 removeEldestEntry를 재정의 하면 캐시로 사용할 수 있는데
사이즈가 100이 넘어 true가 되면 가장 오래된 원소를 제거한다.
protected boolean removeEldestEntry(Map.Entry<K,v> eldest){
return size>100;
}
이걸 함수형 인터페이스로 바꿀 경우 굳이 새로운 형태를 만들 필요는 없고
표준 함수형 인터페이스를 사용하면된다(java.util.function 패키지 안에 많다.)
그러나 java.util.functino 패키지 안에는 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 |
- 표준 함수형 인터페이스 대부분은 기본 타입만 지우너한다. 그렇다고 기본 함수형 인터페이스에 박싱된 기본 타입을 넣어 사용하지는 말자
- 계산량이 많아지면 성능이 처참히 느려질 수 있다.
이번 아이템의 경우 함수형 인터페이스의 활용에 대해 말하고 있는데
하나하나 예시를 좀 만들어서 따로 포스팅하고자 한다.
'책 > 이펙티브자바' 카테고리의 다른 글
Item 46 : 스트림에서는 부작용 없는 함수를 사용하라 (0) | 2021.08.14 |
---|---|
Item 45 : 스트림은 주의해서 사용하라 (0) | 2021.08.13 |
Item 43 : 람다보다는 메소드 참조를 사용하라 (0) | 2021.08.11 |
Item 42 : 익명 클래스보다는 람다를 사용하라 (0) | 2021.08.10 |
Item 41 : 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 (0) | 2021.08.09 |