함수형 인터페이스란
자바에서 함수형 인터페이스란 추상 메소드가 1개만 정의된 인터페이스를 의미한다. 이러한 함수형 인터페이스는 java 8 부터 등장했는데 람다 표현식을 이용해 함수형 프로그래밍을 구현하기 위해 등장했다.
하지만 함수의 형태는 매우 다양하다. 함수의 리턴 값이 있을 수도 없을 수도 있고 매개변수가 1개 혹은 2개일 수도 있다. 이러한 형태의 함수를 매번 새롭게 정의해서 사용하는 건 실질적으로 불가능한데 자바의 함수형 인터페이스 표준 API를 사용하면 이러한 문제를 해결할 수 있다.
Java 함수형 인터페이스 표준 API
함수형 인터페이스 표준 API는 java.util.function 패키지로 제공된다. 이 패키지 안에 있는 대표적인 인터페이스 종류는 다음과 같다.
함수형 인터페이스 | 메소드 형태 | API 활용 | 매개변수 | 반환 값 |
Function<T, R> | R apply(T t) | 매개값을 매핑(=타입변환)해서 리턴하기 | O | O |
Consumer<T> | void accept(T t) | 매개 변수를 사용만 하고 리턴을 하지 않는 함수 형태로 이용 | O | X |
Supplier<T> | T get() | 매개 변수를 사용 안 하고 리턴만 하는 함수 형태로 이용 | X | O |
Predicate<T> | boolean test(T t) | 매개값이 조건이 맞는지 단정해서 boolean 리턴 | O | O |
UnaryOperator<T> | T apply(T t); | 매개값을 연산해서 결과 리턴하기 | O | O |
BinaryOperator<T> | T apply(T t1, T t2) | 매개값을 연산해서 결과 리턴하기 | O | O |
자바는 강타입 언어로 변수나 반환 값을 사용할 때 반드시 그 타입을 지정해야 한다. 위의 표준 API는 이러한 함수의 타입 역할을 한다.
Runnable 인터페이스
함수형 인터페이스와 람다 함수를 이해하기 좋은 예시가 바로 Runnable 인터페이스이다. Java.lang 패키지에 포함된 이 인터페이스는 다음과 같이 정의되어 있다.
그리고 스레드를 생성하는 Thread 클래스 내부를 보면 다음과 같이 정의된 것을 볼 수 있다.
보는 것처럼 Runnable 타입의 target 변수를 받아서 사용하는 걸 볼 수 있다. (함수형 인터페이스인 Runnable이 타입 역할을 하고 있다.)
이러한 Thread 클래스는 다음과 같이 사용할 수 있다.
Thread thread = new Thread( () -> {
for(int i = 0; i < 10; i++) {
System.out.println(i);
}
} );
thread.start();
이처럼 함수형 인터페이스 표준 API를 사용하면 자유롭게 람다식을 할당할 수 있다.
함수형 인터페이스 표준 API 사용법
Function<T, R>
역할 : T -> R 매핑(타입 변환)
메소드 : R apply(T t)
Function<String,Integer> toLength = s -> s.length();
System.out.println(toLength.apply("Java")); // 4
Consumer<T>
역할 : T 입력을 받아 처리만 함(리턴 값 X)
메소드 : void accept(T t)
Consumer<String> printer = System.out::println;
printer.accept("Hello"); // Hello
Supplier<T>
역할 : 인자 없이 T 반환
메소드 : T get()
Supplier<LocalDate> today = LocalDate::now;
System.out.println(today.get()); // 2025-06-08
Predicate<T>
역할 : T 조건 판정 후 boolean 리턴
메소드 : boolean test(T t)
Predicate<Integer> isEven = x -> x % 2 == 0;
System.out.println(isEven.test(4)); // true
UnaryOperator<T>
역할 : 하나의 값을 받아 같은 타입의 결과로 반환
메소드 : T apply(T t)
UnaryOperator<Integer> sq = x -> x * x;
System.out.println(sq.apply(3)); // 9
BinaryOperator<T>
역할 : 두개의 같은 타입의 값을 받아 같은 타입의 결과로 반환
메소드 : T apply(T t1, T t2);
BinaryOperator<Integer> sum = Integer::sum;
System.out.println(sum.apply(2, 5)); // 7
'Java' 카테고리의 다른 글
람다 표현식 (2) | 2025.06.15 |
---|---|
함수형 프로그래밍 (2) | 2025.06.06 |
Java Collection Framework (0) | 2025.05.25 |
Enum (0) | 2025.05.11 |
Singleton 패턴 (0) | 2024.07.16 |