아이템 44. 표준 함수형 인터페이스를 사용하라 #101
Unanswered
Irisation23
asked this question in
3. 과제
Replies: 1 comment 1 reply
-
함수형인터페이스에 붙이는 |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
📝 구성
Basic
Implement it yourself
표준 함수형 인터페이스 ✨
UnOperator<T>
: 인수 1개, 인수의 타입 == 반환 타입BinaryOperator<T>
: 인수 2개, 인수의 타입 == 반환 타입Predicate<T>
: 인수 1개, 반환타입 == booleanFunction<T, R>
: 인수의 타입 != 반환 타입Consumer<T>
: 인수 1개, 반환 XSupplier<T>
: 인수 X, 반환 O박싱된 기본 타입
을 넣어 사용하지 말자@FunctionalInterface
를 붙여야 한다.Table of contents generated with markdown-toc
0. 들어가기에 앞서 🤔
자바가 람다를 지원하면서 API를 작성하는 모범 사례도 크게 바뀌었다.
상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는
템플릿 메서드 패턴
에서 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 방식으로 바뀌게 되었다. 일반화 해보자면 함수 객체를 매개변수로 받는 생성자와 메서드를 더 많이 만들어야 한다는 말이다.중요한 점은 매개변수의
함수 객체 타입
을 올바르게 선택해야 한다.1. Version1 removeEldestEntry() 구현하기 -
Basic
LinkedHashMap
을 이용하여캐시
를 구현한다고 생각해보자.removeEldestEntry()
를@Override
하면 캐시로 사용할 수 있다.가장 오래된 엔트리를 제거하여 Map 객체가 적절한 크기를 유지할 수 있기 때문이다.
직접 구현해 보자
먼저 MyCache 제네릭 클래스
Main 클래스
실행 결과는 다음과 같다.

2. Version2 removeEldestEntry() 구현하기 -
Implement it yourself
MyCache2 제네릭 클래스
EldestEntryRemovalFunction 인터페이스
main 메서드 - 달라진 부분만 기록
자 이렇게 함수형 인터페이스를 직접 정의해서 사용할 수 있다.
하지만
EldestEntryRemovalFunction<K, V>
인터페이스의 구조는 이미 표준 자바 함수형 인터페이스에서 정의하고 있다.3. Version3 removeEldestEntry() 구현하기 -
표준 함수형 인터페이스 ✨
MyCache3 제네릭 클래스
표준 함수형 인터페이스를 사용하라
java.util.function
패키지에 정의 되어있다. 해당 패키지는 43개의 인터페이스가 담겨 있다. (6개의 중요 인터페이스를 통해 종류를 정의 해보자)3.1 표준 함수형 인터페이스의 종류
3.1.1
UnOperator<T>
: 인수 1개, 인수의 타입 == 반환 타입DoubleUnaryOperator
,IntUnaryOperator
,LongUnaryOperator
3.1.2
BinaryOperator<T>
: 인수 2개, 인수의 타입 == 반환 타입DoubleBinaryOperator
,IntBinaryOperator
,LongBinaryOperator
3.1.3
Predicate<T>
: 인수 1개, 반환타입 == booleanDoublePredicate
,IntPredicate
,LongPredicate
BiPredicate<T, U>
3.1.4
Function<T, R>
: 인수의 타입 != 반환 타입DoubleFunction<R>
,IntFunction<R>
,LongFunction<R>
ToDoubleFunciton<T>
,ToIntFunction<T>
,ToLongFunction<T>
ToDoubleBiFunction<T, U>
,ToIntBiFunciton<T, U>
,ToLongBiFunction<T, U>
3.1.5
Consumer<T>
: 인수 1개, 반환 XDoubleConsumer
,IntConsumer
,LongConsumer
BiConsumer<T, U>
ObjDoubleConsumer<T>
,ObjIntConsumer<T>
,ObjLongConsumer<T>
3.1.6
Supplier<T>
: 인수 X, 반환 ODoubleSupplier
,IntSupplier
,LongSupplier
,BooleanSupplier
4. 표준 함수형 인터페이스의 도입시 주의 사항 🚨
4.1 기본 함수형 인터페이스에
박싱된 기본 타입
을 넣어 사용하지 말자4.2 표준 함수형 인터페이스 대신 직접 구현해야 할 때도 있다.
Comparator<T>
인터페이스를 생각 해보자.구조적으로는
ToIntBiFunction<T, U>
와 동일하다. 근데 왜 따로 정의 해 두었을까? 🤔디폴트 메서드
를 담고있다.정리하자면 아래의 내용중 하나라도 만족하는 경우가 있다면 함수형 인터페이스를 구현할 것을 고민해 볼 수 있다.
함수형 인터페이스도 인터페이스이다. 도입을 하기로 마음 먹었다면 #52 을 고려한 뒤에 도입해야 한다.
5. 직접 함수형 인터페이스를 만들 때 주의사항 🚨
5.1
@FunctionalInterface
를 붙여야 한다.5.2 서로 다른 함수형 인터페이스를 같은 위치의 인수로 받는 메서드를 오버로딩하면 안된다.
잘못 설계된 예는 자바에 있다.
Callable<T>
를 받는 것과Runnable
을 받는 것을 다중 정의했다.6. 핵심 정리 📚
java.util.function
패키지의 표준 함수형 인터페이스에 정의 되어있다면 해당 패키지를 이용하자.혹시나
,그럴 경우가 드물겠지만
직접 새로운 함수형 인터페이스를 만들어 쓰는게 좋을 수 있다면 해당 글로 돌아와 주의사항을 체크 해 보자.7. 회고 🧹
2023.02.06
Java
에서 함수형 코드를 도입하게 되었기 때문에 보다 심도 깊은 내용이 필요하다 생각했다.Beta Was this translation helpful? Give feedback.
All reactions