함수형 인터페이스(Functional Interface)
: 단 하나의 추상 메서드만 선언된 인터페이스
@FunctionalInterface
interface SquareFunction() {
public abstract int square(int a);
}
* interface의 추상메서드는 public하면서 abstract이므로 public abstract 생략 가능
* @FunctionalInterface 어노테이션은 안붙여도 상관없지만 붙이면 함수형 인터페이스 사용시 컴파일러가 두 개 이상의 추상 메서드를 만드는 것을 막아줌
함수형 인터페이스를 사용하면 람다식을 참조변수에 담아 사용할 수 있다.
(단, 함수형 인터페이스의 메서드와 람다식의 매개변수 개수와 반환타입이 일치해야 한다)
@FunctionalInterface
interface SquareFunction() {
int square(int a);
}
SquareFunction sq = a -> a * a;
int result = sq.sqaure(2); // OK
Example
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
list.sort(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
---
// 람다식 사용
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
list.sort((s1, s2) -> s1.compareTo(s2));
// [aaa, aaa, abc, bbb, ddd]
* Comparator는 함수형 인터페이스이므로 람다식 사용이 가능하다.
매개변수에 함수형 인터페이스 사용
@FunctionalInterface
interface MyFunction() {
void myMethod();
}
// 매개변수에 람다식
void testMethod(MyFunction f) {
f.myMethod(); // MyFunction에 정의된 메서드 호출
}
Myfunction f = () -> System.out.println("Hello World!");
testMethod(f);
반환타입으로 함수형 인터페이스 사용
MyFunction myMethod() {
MyFunction f = () -> System.out.println("Hello World!");
return f;
}
-- or --
MyFunction myMethod() {
return () -> System.out.println("Hello World!");
}
람다식을 사용하기 위해서 함수형 인터페이스를 매번 만들어야 할까?
→ NO! java.util.function 패키지를 사용하자
함수형 인터페이스 | 메서드 | 매개변수 | 반환값 | 설명 |
java.lang.Runnable | void run() | X | X | 매개변수X, 반환값X |
Supplier<T> | T get() | X | O | 매개변수X, 반환값O |
Consumer<T> | void accept(T t) | O | X | Supplier와 반대로 매개변수O, 반환값X |
Function<T, R> | R apply(T t) | O | O | 하나의 매개변수를 받아서 결과를 반환하는 일반적인 함수 |
Predicate<T> | boolean test(T t) | O | O | 조건식을 표현하는데 사용. 매개변수 하나, boolean 리턴 |
ex)
// 원래는 Predicate<Integer, Boolean> 이라고 써야하지만 반환 타입이 항상 Boolean이기 때문에 Boolean은 생략
Predicate<Integer> f = a -> a % 2 == 0;
Function<Integer, Integer> f = a -> a / 10;
매개변수가 2개인 함수형 인터페이스
함수형 인터페이스 | 메서드 | 반환값 | 설명 |
BiConsumer<T, U> | void accept(T t, U u) | X | 매개변수 두개, 반환값X |
BiPredicate<T> | boolean test(T t, U u) | O | 조건식을 표현하는데 사용, 매개변수2개, 반환값 boolean |
BiFunction<T, U, R> | R apply(T t, U u) | O | 두개의 매개변수를 받아서 하나의 결과를 반환 |
매개변수가 3개인 함수형 인터페이스?
→ 필요하다면 직접 만들어서 사용하자
@FunctionalInterface
interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
}
매개변수의 타입과 반환타입이 일치하는 함수형 인터페이스
함수형 인터페이스 | 메서드 | 설명 |
UnaryOperator<T> | T apply(T t) | Function의 자손. Function과 달리 매개변수와 결과의 타입이 같다. |
BinaryOperator<T> | T apply(T t, T t) | BiFunction의 자손. BiFunction과 달리 매개변수와 결과의 타입이 같다. |
'개발 > Java' 카테고리의 다른 글
람다식(Lambda Expression) (0) | 2023.07.15 |
---|