brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Feb 11. 2019

Effective Java3/E - 람다와 스트림

#44 표준 함수형 인터페이스를 사용하라

Effective Java 3/E - 람다와 스트림


#44 표준 함수형 인터페이스를 사용하라


표준 함수형 인터페이스를 사용해야 하는 이유에 대해 알아보겠습니다.




#01 java.util.LinkedHashMap#removeEldestEntry(Map.Entry<K, V> eldest)


#01 LinkedHashMap#removeEldestEntry(...)


LinkedHashMap 클래스removeEldestEntry(Map.Entry<K, V> eldest) 메서드를 통해 알아보겠습니다.


LinkedHashMap은 순서를 보장하는 HashMap으로, 가장 오래된 원소를 제거할 때 removeEldestEntry(...) 메서드의 반환 값을 보고 판단합니다.


#02 FixedLinkedHashMap class


유지해야 하는 가장 최근 원소 개수를 지정하려면, 위처럼 생성자를 통해 값을 지정하거나 별도의 메서드를 통해야 합니다.




#02 함수형 인터페이스


#03 함수형 인터페이스


함수형 인터페이스를 통해 구현할 수 도 있습니다.




#03 표준 함수형 인터페이스


#04 표준 함수형 인터페이스


굳이 직접 함수형 인터페이스를 만들지 않아도, 표준 함수형 인터페이스를 통해 구현할 수 있습니다.

EldestEntryRemovalFunction 인터페이스 대신, BiPredicate 인터페이스를 이용할 수 있습니다.


이미 표준이기 때문에 쓰는 입장에서도 편하고, 표준 함수형 인터페이스 내부에 Default 메서드가 많이 있기 때문에 좀 더 유용합니다.




#04 java.util.function 패키지


java.util.function 패키지에는 총 43개의 표준 함수형 인터페이스들이 있습니다.


#05 주요 6가지 인터페이스


인터페이스들에 대한 설명은 아래 링크를 참고하기 바랍니다.

https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html




#05 커스텀 함수형 인터페이스


앞선 내용에 반하지만, 커스텀한 함수형 인터페이스를 만들어야 하는 경우들도 있습니다.

예를 들어 인수를 3개 이상, 여러 개 받는다던가 내부적으로 다른 처리가 필요한 경우가 있습니다.


그런데 구조적으로 같은 표준 함수형 인터페이스가 있지만 커스텀하게 만들어야 하는 경우도 있습니다.


#06 Comparator and ToIntBiFunction 인터페이스


Comparator 인터페이스ToIntBiFunction 인터페이스는 구조적으로 같습니다.

하지만  Comparator 인터페이스가 필요한 이유가 있습니다.


자주 쓰이며, 이름 자체가 용도를 명확히 설명해준다. (Comparator는 '비교자'라는 의미를 가진다.)

반드시 따라야 하는 규약이 있다. (각 인스턴스를 비교해야 한다.)

유용한 Default 메서드를 제공할 수 있다. (reverse, thenComparing 등)




#06 커스텀 함수형 인터페이스 주의할 점


@FunctionalInterface annotation


함수형 인터페이스에는 @FunctionalInterface annotation을 달아야 합니다.

함수형 인터페이스는 하나의 추상 메서드만 가져야 하기 때문에, 이 어노테이션을 달아두면 나중에 유지보수 과정에서 실수로 추상 메서드를 추가하는 일을 방지할 수 있습니다.




입력값과 반환 값에 함수형 인터페이스 타입을 이용할 수 있습니다.

함수형 인터페이스 타입을 이용하는 게 익숙하진 않지만, 람다식을 활용할 수 있어서 코드가 좀 더 간결해지는 거 같네요.


게다가 인터페이스내 Default 함수도 있기 때문에 좀 더 활용 범위가 넓어지는 거 같습니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari