자바 함수형 인터페이스란 단 하나의 추상 메서드를 가지고 있는 인터페이스이다.
자바 표준 라이브러리에는 여러 유용한 함수형 인터페이스들이 포함되어 있다. 그 중 가장 기본적인 함수형 인터페이스는 java.util.function 패키지에 위치하고 있다.
몇가지 주요 함수형 인터페이스를 살펴보면 다음과 같다
// 매개변수 없이 값을 제공하는 역할을 하는 함수형 인터페이스
@FunctionalInterface
public interface Supplier<T> {
T get();
}
// 값을 소비하는 역할을 하는 함수형 인터페이스
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
// 주어진 조건에 따라 참 또는 거짓을 반환하는 함수형 인터페이스
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
// 주어진 입력에 대해 어떤 출력을 생성하는 함수형 인터페이스
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
자바 표준 라이브러리에서 제공하는 함수형 인터페이스 뿐만 아니라 사용자 정의 함수형 인터페이스를 정의할 수도 있다.
간단한 사용자 정의 함수형 인터페이스의 예시를 보자
// 이 애노테이션으로 함수형 인터페이스를 정의한다
// 만약 추상 메서드가 한개 이상이라면 에러가 발생한다
@FunctionalInterface
interface Calculator {
int calculate(int a, int b);
}
public class CustomFunctionalInterfaceExample {
public static void main(String[] args) {
// 사용자 정의 함수형 인터페이스의 람다 표현식 사용
Calculator addition = (a, b) -> a + b;
System.out.println("Addition: " + addition.calculate(5, 3));
// 사용자 정의 함수형 인터페이스의 람다 표현식 사용
Calculator subtraction = (a, b) -> a - b;
System.out.println("Subtraction: " + subtraction.calculate(8, 3));
}
}
위 예시에서는 Calculator라는 사용자 정의 함수형 인터페이스를 정의하였고, 이 calculate 메서드는 두 개의 정수를 받아서 정수 값을 반환하는 추상메서드이다.
이 인터페이스에 @FunctionalInterface 애노테이션을 사용하여 해당 인터페이스가 함수형 인터페이스임을 명시적으로 표시하면 사용자 정의 함수형 인터페이스가 된다.
이렇게 정의한 사용자 정의 함수형 인터페이스는 람다 표현식이나 메서드 참조와 함께 사용될 수 있다.
람다 표현식으로 함수형 인터페이스의 추상 메서드 구현을 직접 전달할 수 있으므로 전체 표현식을 함수형 인터페이스의 인스턴스로 취급할 수 있는 것이다.
함수형 인터페이스를 사용한 예시를 알아보고 이번 글은 마무리하도록 하겠다.
Consumer 예제
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
public class Example {
public static <T> void forEach(List<T> list, Consumer<T> c) {
for (T t : list) {
c.accept(t);
}
}
public static void main(String[] args) {
List<String> languages = Arrays.asList("Java", "Python", "JavaScript", "C++");
// Consumer 인터페이스의 인스턴스 생성코드
/** Consumer<String> printUpperCase = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s.toUpperCase());
}
}; */
// 람다 표현이 더 간결하고 가독성있다
Consumer<String> printUpperCase = s -> System.out.println(s.toUpperCase());
// forEach 메서드를 사용하여 리스트의 각 요소에 대해 printUpperCase Consumer를 적용
forEach(languages, printUpperCase);
}
}
'Java' 카테고리의 다른 글
Singleton (0) | 2024.03.09 |
---|---|
불변 객체(Immutable Object) (0) | 2024.03.04 |
Builder Pattern (빌더 패턴) (0) | 2024.03.02 |
BigInteger.valueOf와 정적 팩토리 메서드 (0) | 2024.02.29 |
람다 표현식 - 1. 람다 표현식 기본 개념 (0) | 2023.11.26 |