본문 바로가기
개발/Java

함수형 인터페이스(Functional Interface)

by jeounpar 2023. 7. 16.

함수형 인터페이스(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