안녕세계

[Java] 함수형 인터페이스 (Functional Interface) 본문

[Java] 함수형 인터페이스 (Functional Interface)

Junhong Kim 2020. 2. 11. 21:59
728x90
반응형

지난 포스팅에 이어서 본 포스팅에서는 Java8에 이미 정의된 함수형 인터페이스에 대해 알아봅니다.

 

함수형 인터페이스를 개발자가 직접 만들어서 사용할 수 있지만 항상 새로운 함수형 인터페이스를 정의하기보다는,

자주 쓰이는 형식의 인터페이스는 java.util.function 패키지에 이미 정의된 인터페이스를 사용하는 것을 권장합니다.

1. 기본 함수형 인터페이스

기본 함수형 인터페이스는 매개변수와 반환값에 유무에 따라 함수형 인터페이스 존재합니다.

(T: 데이터 타입, R: 리턴 타입)

함수형 인터페이스 메서드 매개변수 반환값
java.lang.Runnable void run() X X
Supplier<T> T get() X O
Consumer<T> void accept(T t) O X
Function<T, R> R apply(T t) O O
Predicate<T> boolean test(T t) O O

*Function과 Predicate의 차이는 반환 값이 boolean이라는 것만 다르고 Function과 동일합니다.

// Supplier
Supplier<String> supplier = () -> "String";
System.out.println(supplier.get()); // String


// Consumer
Consumer<Integer> consumer = (num) -> System.out.println(num + 1);
consumer.accept(1); // 2


// Function
Function<Integer, Integer> function = (num) -> num + 1;
int result1 = function.apply(1);
System.out.println(result1); // 2


// Predicate
Predicate<Integer> predicate = (num) -> num > 0;
boolean result2 = predicate.test(1);
System.out.println(result2); // true

 

2. 매개변수가 두 개인 함수형 인터페이스

(T/U: 데이터 타입, R: 리턴 타입)

함수형 인터페이스 메서드 매개변수 반환값
BiConsumer<T, U> void accept(T t, U u) O O
BiFunction<T, U, R> R apply(T t, U u) O O
BiPredicate<T, U> boolean test(T t, U u) O O
// BiConsumer
BiConsumer<Integer, Integer> biConsumer = (num1, num2) -> System.out.println(num1 + num2);
biConsumer.accept(1, 2); // 3


// BiFunction
BiFunction<Integer, Integer, Integer> biFunction = (num1, num2) -> num1 + num2;
int result1 = biFunction.apply(1, 2);
System.out.println(result1); // 3


// BiPredicate
BiPredicate<Integer, Integer> biPredicate = (num1, num2) -> num1 > num2;
boolean result2 = biPredicate.test(1, 2);
System.out.println(result2); // false

3. 매개변수 타입과 반환 타입이 일치하는 함수형 인터페이스

Function과 BiFunction을 사용할 때 매개변수와 반환값 타입이 같다면 더 편리하게 사용할 수 있는 인터페이스입니다.

함수형 인터페이스 메서드 매개변수 반환값
UnaryOperator<T> T apply(T t) O O
BinaryOperator<T> T apply(T t, T t) O O
// UnaryOperator
UnaryOperator<Integer> unaryOperator = (num) -> num;
int result1 = unaryOperator.apply(1);
System.out.println(result1); // 1

// BinaryOperator
BinaryOperator<Integer> binaryOperator = (num1, num2) -> num1 + num2;
int result2 = binaryOperator.apply(1, 2);
System.out.println(result2); // 3

 

이처럼 이미 정의된 함수형 인터페이스를 적극적으로 사용하면 메서드 이름을 통일 시킬 수 있습니다.

컬렉션 프레임워크 인터페이스에 추가된 함수형 인터페이스를 알아보겠습니다.

감사합니다.

728x90
반응형
Comments