본문 바로가기
JAVA

Functional Interface 파고들기

by HCastle 2022. 4. 28.
반응형

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) 동일한 유형의 두 피연산자에 대한 연산과 피연산자와 동일한 유형의 결과를 반환

 

 

 

반응형

댓글