Functional Interface 는 JDK 1.8 부터 추가된 기능으로 람다(lambda) 표현식과 메서드 참조(method reference) 를 사용할 수 있습니다. (람다 표현식과 메서드 참조는 내용이 많으므로 설명을 생략)
Functional Interface 는 functional method 라고 불리는 하나의 abstract method 만 존재해야 하며 0개 이상의 default(or static) method 를 갖고 있을 수 있고, 사용시 입력값과 반환값을 자동으로 할당해 주는 특징이 있으며 @FunctionalInterface 어노테이션이 달려있습니다.
@FunctionalInterface 어노테이션이 없어도 Functional Interface 로서 동작하는데에는 문제는 없지만,
abstract method 가 1개가 아닐경우 compile error 를 발생시켜 발생될 수 있는 오류를 사전에 방지해 주니 꼭 추가해 줘야 합니다.
어노테이션만 보고도 Functional Interface 라는 것을 알 수 있다는 장점도 있습니다.
JAVA 11 API - Function Package : https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/function/package-summary.html
java.util.function (Java SE 11 & JDK 11 )
Functional interfaces provide target types for lambda expressions and method references. Each functional interface has a single abstract method, called the functional method for that functional interface, to which the lambda expression's parameter and retu
docs.oracle.com
Functional Interface 는 람다 표현식과 메서드 참조를 이용하고 입력값과 출력값에 대한 할당을 자동으로 처리해 주기 때문에 코드를 간략하게 작성할 수 있도록 도와줍니다.
이해를 위해 예시입니다.
예시)
private void getStudentsName(List<StudentDTO> students) {
System.out.println(students.stream().map(a -> a.getName()).collect(Collectors.toList()));
}
[map method]
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
위 내용은 List<StudentDTO> 객체를 이름 리스트 - List<String> 로 변환하여 출력하며
map method 는 Function 인터페이스의 유일한 abstract 메서드인 R apply(T t) 메서드에 StudentDTO 객체를 넘겨 이름 - String 을 반환합니다.
이러한 Functional Interface 는 입력값의 수와 타입, 반환값의 유무 및 타입에 따라 분류하여 볼 수 있습니다.
대표적인 Functional Interface 이며 이 Interface 들을 변형한 추가적인 인터페이스들 있습니다.
(API 문서 참조 : https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/function/package-summary.html)
Interface | Return Type | Functional Method | Description |
Consumer<T> | void | accept(T t) | 단일 입력을 받고 결과 반환하지 않음 |
Function<T,R> | R | apply(T t) | 단일 입력을 받아 결과값을 반환 |
Predicate<T> | boolean | test(T t) | 단일 입력을 받아 boolean 값 반환 |
Supplier<T> | T | get() | 입력값 없이 결과 값 반환 |
UnaryOperator<T> | T | Function.apply(Object) | 하나의 피연산자에 대한 연산과 피연산자와 동일한 유형의 결과 반환 |
BinaryOperator<T> | T | BiFunction.apply(T t, T u) | 동일한 유형의 두 피연산자에 대한 연산과 피연산자와 동일한 유형의 결과를 반환 |
'JAVA' 카테고리의 다른 글
Functional Interface 파고들기 - Predicate, Consumer, Supplier + (0) | 2022.05.02 |
---|---|
Functional Interface 파고들기 - Function + (0) | 2022.04.29 |
JPA - Auditing 과 상속을 통한 공통 속성 공통화 (0) | 2022.03.16 |
JPA - 영속성 전이 (0) | 2022.03.14 |
Tabnine AI Code Completion ( IntelliJ 자동완성 지원 plugin) (0) | 2022.02.18 |
댓글