템플릿 메소드 부터 알아보고 가겠다.

 

템플릿 메소드 패턴은 자바 디자인 패턴 중 하나이며 소스코드상의 알고리즘에서

특정 환경 또는 상황에 맞게 확장 또는 변경을 해야 할 경우 매우 유용한 패턴이다.

 

이름을 모르더라도 객체 지향적으로 개발하다보면 무의식적으로 만들게 되는 패턴이다.

 

추상클래스에 기본틀을 만들고 확장을 통해 추가로 구현해야 할 기능을 정의하는 방식이다.

 

예를 들어 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
  • 표준 함수형 인터페이스 대부분은 기본 타입만 지우너한다. 그렇다고 기본 함수형 인터페이스에 박싱된 기본 타입을 넣어 사용하지는 말자
  • 계산량이 많아지면 성능이 처참히 느려질 수 있다.

 

 

이번 아이템의 경우 함수형 인터페이스의 활용에 대해 말하고 있는데

하나하나 예시를 좀 만들어서 따로 포스팅하고자 한다.

+ Recent posts