함수형 인터페이스란, 자바8에서 지원하는 함수형 인터페이스

2021. 1. 14. 10:48JAVA

함수형 인터페이스란?

인터페이스에 추상메서드 하나만 선언되어 있는 인터페이스. (두개거나 없으면 함수형 인터페이스가 아니다.)

@FunctionalInterface 애노테이션을 지원하여 해당 인터페이스에 추가하면 두 개 이상의 추상 메서드가 선언되면 컴파일 에러가 나도록 지원한다.

 

@java.lang.FunctionalInterface
public interface FunctionalInterface {

    int doIt(int input);

}

 

함수형 인터페이스가 생겨난 배경은?

왜 이런 특수한 형태의 인터페이스가 생겨났을까? 바로 람다식을 지원하기 위해서이다.

생각해보면 람다식이 추상메서드를 구현할때 어떤 메서드인지, 메서드명을 명시하지 않는다. 이는 람다식은 무조건 함수형인터페이스인 경우에만 사용할 수 있으며, 함수형 인터페이스는 추상메서드가 단 1개이기 때문에 메서드명을 명시하지 않아도 사용할 수 있는 형태가 된다.

 

자바에서 지원하는 함수형 인터페이스

근데 람다식을 사용하기 위해 함수형 인터페이스를 일일이 만드는것은 생산성이 떨어진다. 그래서 자바에서는 자주 쓰이는 추상메서드 형태를 템플릿으로 제공하고 있다. 개발자가 원하는 타입을 사용할 수 있도록 제네릭으로 되어 있다. 개발자에게 중요한 것은, 해당 인터페이스를 구현하는 구현내용이다.

 

java.util.function 패키지

함수형 인터페이스 인자값 리턴값 추상 메서드 함수 조합용 메서드
Runnable 없음 없음 void run()  
Function<T, R> T R R apply(T t) andThen
compose
Consumer<T> T 없음 void accept(T t) andThen
Supplier<R> 없음 R R get()  
Predicate<T> T boolean boolean test(T t) and
or
negate

이 5가지 함수형 인터페이스가 기본이다.

 

함수 조합용 메서드

andThen

a.andThen(b).apply("인자값") -> 쉽게 생각해서 a실행하고 b실행

1. 인자값을 받아 a 실행

2. a 실행하여 리턴하는 값을 b의 인자값으로 실행.

 

compose

a.compose(b).apply("인자값") -> 쉽게 생각해서 b실행하고 a실행

1. 인자값을 받아 b 실행

2. b 실행하여 리턴하는 값을 a의 인자값으로 실행.

 

and

a.and(b).test("인자값")

1. 인자값을 받아 a 실행한 값과 인자값을 받아 b 실행한 값의 and 연산

 

or

a.or(b).test("인자값")

1. 인자값을 받아 a 실행한 값과 인자값을 받아 b 실행한 값의 or연산

 

negate

a.nagate().test("인자값")

1. 인자값을 받아 a 실행한 값의 부정(!) 연산

인자값 두개 받기

여기서 인자값을 두개를 받고 싶다면 해당 함수형인터페이스 앞에 Bi를 붙인 이름의 인터페이스도 제공된다.

ex) BiFunction<T,U,R>, BiConsummer<T,U>, BiPredicate<T,U>

전부 T,U를 인자로 받아 처리한다.

 

인자값 세개 받기 -> 직접 구현해야한다.

 

그 밖에..

인자값, 리턴값 타입이 같다면?

UnaryOperator<T> -> Function<T, R>의 특수한 형태로 같은 타입을 인자로 받아 같은 타입으로 리턴한다.

BinaryOperator<T> -> BiFunction<T,U,R>의 특수한 형태로 같은 타입을 인자로 받아 같은 타입으로 리턴한다. 

'JAVA' 카테고리의 다른 글

JAVA Collection - List 시간 복잡도  (0) 2021.02.17
parseInt와 valueOf의 차이점  (0) 2021.01.16
Optional이란?  (0) 2021.01.16
자바8, 스트림  (0) 2021.01.15
자바8 람다식의 사용법과 장단점.  (0) 2021.01.12