2021. 1. 14. 10:48ㆍJAVA
함수형 인터페이스란?
인터페이스에 추상메서드 하나만 선언되어 있는 인터페이스. (두개거나 없으면 함수형 인터페이스가 아니다.)
@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 |