본문 바로가기

JAVA

[JAVA8] 함수형 인터페이스 정리

728x90
반응형

함수형 인터페이스는 오직 하나의 추상 메서드를 지정한다.
함수형 인터페이스의 추상 메서드는 람다 표현식의 시그너처를 묘사한다. 함수형 인터페이스의 추상 메서드 시그너처를 함수 디스크립터라고 한다.

자바8 라이브러리에서 제공하고 있는 function패키지에 함수형 인터페이스를 알아보자.
function 패키지에서 지원하고 있는 함수형 인터페이스는 별도에 인터페이스 정의 없이 바로 개발자가 사용할 수 있다.

1. Predicate
Predicate<T> 인터페이스는 test라는 추상 메서드를 정의하고 test는 제네릭 형식 T의 객체를 인수로 받아 boolean을 반환한다.

@FunctionInterface
public interface Predicate<T> {
    boolean test(T t);
}

*기본형 특화형 : IntPredicate, LongPredicate, DoublePredicate

2. Consumer
Consumer<T> 인터페이스는 제네릭 형식 T 객체를 받아서 void를 반환하는 accept추상 메서드를 정의합니다. T 형식의 객체를 전달 받아 어떤 동작을 수행하고자 할 때 사용됨.

@FunctionInterface
public interface Consumer<T>{
    void accept(T t);
}

*기본형 특화형 : IntConsumer, LongConsumer, DoubleConsumer

3. Function
Function<T,R> 인터페이스는 제네릭 형식 T를 인수로 받아서 제네릭 형식 R 객체를 반환하는 apply 추상 메서드를 정의 합니다. 입력을 출력으로 맵핑하는 람다를 정의 할 때 활용할 수 있습니다.

@FunctionInterface
public interface Fucntion<T, R>{
    R apply(T t);
}

*기본형 특화형 : IntFunction<R>, IntToDoubleFunction, IntToLongFunction, LongFunction<R>, LongToDoubleFunction, LongToIntFunction, DoubleFunction<R>, ToIntFunction<T>, ToDoubleFunction<T>, ToLongFunction<T>

위 세 개의 제네릭 함수형 인터페이스를 보면 모두 제네릭 파라미터만 지원하고 있기 때문에 int, double과 같은 기본형은 사용하지 못한다. 즉 Integer, Double과 같은 참조형을 사용해야만 한다.

다행히 자바에서 박싱, 언박싱, 오토 박싱을 지원함으로서 기본형을 참조형으로 변환하여 사용할 수 있지만 이와 같은 절차가 또다른 비용으로 발생된다는 단점이 있다.

이와 같은 단점을 보완하고자 자바 8에서는 기본형 특화 함수형 인터페이스를 제공한다.

public interface IntPredicate {
    boolean test(int t);
}

일반적으로 특정 형식을 입력으로 받는 함수형 인터페이스는 이름 앞에 형식을 추가 한다. (DoublePredicate, IntConsumer, IntFunction, IntToDoubleFunction...)
다양한 인터페이스는 아래 링크를 통해 알아보자.
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

4. Supplier<T> : () -> T
*기본형 특화형: BooleanSupplier, IntSupplier, LongSupplier, DoubleSupplier
5. UnaryOperator<T> : T -> T
*기본형 특화형: IntUnaryOperator, LongUnaryOperator, DoubleUnaryOperator
6. BinaryOperator<T> : (T , T) -> T
*기본형 특화형:IntBinaryOperator, LongBinaryOperator, DoubleBinaryOperator
7. BiPredicate<L, R> : (L, R) -> boolean
8. BiConsumer<T, U> : (T, U) -> void
*기본형 특화형:ObjIntConsumer<T>, ObjLongConsumer<T>, ObjDoubleConsumer<T>
9. BiFunction<T, U, R> : (T, U) -> R
*기본형 특화형:ToIntBiFunction<T, U>, ToLongBiFunction<T, U>, ToDoubleBiFunction<T, U>

728x90
반응형