표준 함수형 인터페이스를 사용하라
자바 표준 라이브러리에 여러 표준 함수형 인터페이스가 담겨있다. 따라서, 필요한 용도에 맞는게 이미 존재한다면, 직접 구현하지말고 표준 함수형 인터페이스를 사용하자.
총 43개의 인터페이스 중 대표적으로 기억해야할 기본 인터페이스 6개의 이름과 함수 시그니처는 다음과 같다.
UnaryOperator<T>: T apply(T t)
BinaryOperator<T>: T apply(T t1, T t2)
Predicate<T>: boolean test(T t)
Function<T,R>: R apply(T t)
Supplier<T>: T get()
Consumer<T>: void accept(T t)
이어서, 기본 인터페이스는 기본 타입으로 int, long, double로 각 3개씩 변형이 존재한다. 해당 기본 인터페이스 이름 앞에 기본 타입의 이름을 붙여 지었다. 예를 들어 int를 받는 Predicate는 IntPredicate이다.
6개의 기본 인터페이스 중 Function의 반환 타입만 매개변수화 되었는데 무슨 이야기냐 하면 LongFunction<int[]>라는 코드가 있으면 long을 인수로 받아 int[]를 반환한다는 뜻이다.
또한 Function의 인터페이스는 기본타입의 파라미터, 반환형 각각 3개씩이 가능한 총 9개의 인터페이스 변형이 있다.
이름이 SourceToResult로 Source 자리엔 파라미터, Result 자리엔 반환형이 온다. 예를들면, LongToIntFunction 이렇게 표현할 수 있다. 이렇게 만들어진게 총 6개가 존재한다.
나머지 3개는 입력을 매개변수화 하여 ToResult 형식으로 표현한다. 즉, ToLongFunction<int[]>로 int[]를 인수로 받아 long을 반환한다는 뜻이다.
또한, 인수를 두개씩 받는 변형은 앞에 Bi를 붙인다. Ex: BiFunction<T,U,R>
그러나, 이런 함수형 인터페이스는 총 43개라 외우기도 힘들고 이름의 규칙성도 찾기 어렵다. 따라서, 필요할때 찾아쓸 수 있을만큼만은 알자!
또한, 표준 함수형 인터페이스는 기본 타입만 지원하는데, 기본 함수형 인터페이스에 박싱된 기본타입을 넣어 사용하지 말아야한다. 박싱을 하는 과정에서 성능이 나빠질 수 있기 때문이다.
물론, 이렇게 43개의 인터페이스에 존재하지 않거나, 예외를 던져야하는 경우엔 직접 함수형 인터페이스를 작성해야한다. 이때는 Comparator의 쓰임새를 기억하면된다. Comparator가 자주 쓰이는 이유는 이름 자체로 용도를 명확히 설명할 수 있다는 점, 반드시 따라야 하는 규약이 있다는 점, 유용한 디폴트 메서드를 제공할 수 있다는 점이다.
이렇게 새로 작성을 할때는 이가 인터페이스임을 명심하고 설계해야한다.
@FunctionalInterface를 사용하는 이유
1. 해당 클래스의 코드를 읽을때 람다용으로 작성되었음을 명시함
2. 컴파일단계에서 추상 메서드가 오직 하나임을 확인할 수 있게 도움
3. 유지 보수 과정에서 누군가 임의로 추상 메서드를 추가할 수 없게 만듦.
주의 사항
함수형 인터페이스의 API를 사용할때, 서로 다른 함수형 인터페이스를 같은 위치의 인수로 받는 메서드를 다중 정의하지말자. 클라이언트에게 모호함을 주어 여러 문제가 발생할 수 있다.
'PL > 모던 자바 인 액션' 카테고리의 다른 글
자바 병렬 프로그래밍 - 1장 (0) | 2023.09.07 |
---|---|
모던 자바 인 액션 5주차 - Chap06 (0) | 2023.09.07 |
Effective Java - item 42 (0) | 2023.08.23 |
모던 자바 인 액션 스터디 - 3주차 (0) | 2023.08.23 |
HashMap의 동작 구조 (0) | 2023.08.16 |
표준 함수형 인터페이스를 사용하라
자바 표준 라이브러리에 여러 표준 함수형 인터페이스가 담겨있다. 따라서, 필요한 용도에 맞는게 이미 존재한다면, 직접 구현하지말고 표준 함수형 인터페이스를 사용하자.
총 43개의 인터페이스 중 대표적으로 기억해야할 기본 인터페이스 6개의 이름과 함수 시그니처는 다음과 같다.
UnaryOperator<T>: T apply(T t)
BinaryOperator<T>: T apply(T t1, T t2)
Predicate<T>: boolean test(T t)
Function<T,R>: R apply(T t)
Supplier<T>: T get()
Consumer<T>: void accept(T t)
이어서, 기본 인터페이스는 기본 타입으로 int, long, double로 각 3개씩 변형이 존재한다. 해당 기본 인터페이스 이름 앞에 기본 타입의 이름을 붙여 지었다. 예를 들어 int를 받는 Predicate는 IntPredicate이다.
6개의 기본 인터페이스 중 Function의 반환 타입만 매개변수화 되었는데 무슨 이야기냐 하면 LongFunction<int[]>라는 코드가 있으면 long을 인수로 받아 int[]를 반환한다는 뜻이다.
또한 Function의 인터페이스는 기본타입의 파라미터, 반환형 각각 3개씩이 가능한 총 9개의 인터페이스 변형이 있다.
이름이 SourceToResult로 Source 자리엔 파라미터, Result 자리엔 반환형이 온다. 예를들면, LongToIntFunction 이렇게 표현할 수 있다. 이렇게 만들어진게 총 6개가 존재한다.
나머지 3개는 입력을 매개변수화 하여 ToResult 형식으로 표현한다. 즉, ToLongFunction<int[]>로 int[]를 인수로 받아 long을 반환한다는 뜻이다.
또한, 인수를 두개씩 받는 변형은 앞에 Bi를 붙인다. Ex: BiFunction<T,U,R>
그러나, 이런 함수형 인터페이스는 총 43개라 외우기도 힘들고 이름의 규칙성도 찾기 어렵다. 따라서, 필요할때 찾아쓸 수 있을만큼만은 알자!
또한, 표준 함수형 인터페이스는 기본 타입만 지원하는데, 기본 함수형 인터페이스에 박싱된 기본타입을 넣어 사용하지 말아야한다. 박싱을 하는 과정에서 성능이 나빠질 수 있기 때문이다.
물론, 이렇게 43개의 인터페이스에 존재하지 않거나, 예외를 던져야하는 경우엔 직접 함수형 인터페이스를 작성해야한다. 이때는 Comparator의 쓰임새를 기억하면된다. Comparator가 자주 쓰이는 이유는 이름 자체로 용도를 명확히 설명할 수 있다는 점, 반드시 따라야 하는 규약이 있다는 점, 유용한 디폴트 메서드를 제공할 수 있다는 점이다.
이렇게 새로 작성을 할때는 이가 인터페이스임을 명심하고 설계해야한다.
@FunctionalInterface를 사용하는 이유
1. 해당 클래스의 코드를 읽을때 람다용으로 작성되었음을 명시함
2. 컴파일단계에서 추상 메서드가 오직 하나임을 확인할 수 있게 도움
3. 유지 보수 과정에서 누군가 임의로 추상 메서드를 추가할 수 없게 만듦.
주의 사항
함수형 인터페이스의 API를 사용할때, 서로 다른 함수형 인터페이스를 같은 위치의 인수로 받는 메서드를 다중 정의하지말자. 클라이언트에게 모호함을 주어 여러 문제가 발생할 수 있다.
'PL > 모던 자바 인 액션' 카테고리의 다른 글
자바 병렬 프로그래밍 - 1장 (0) | 2023.09.07 |
---|---|
모던 자바 인 액션 5주차 - Chap06 (0) | 2023.09.07 |
Effective Java - item 42 (0) | 2023.08.23 |
모던 자바 인 액션 스터디 - 3주차 (0) | 2023.08.23 |
HashMap의 동작 구조 (0) | 2023.08.16 |