반응형

Java에서 함수형 인터페이스(Functional Interface)는 단 하나의 추상 메소드를 가진 인터페이스를 말합니다. 이러한 인터페이스는 람다 표현식(lambda expression)과 함께 사용되어 코드의 간결성을 높이고, 함수형 프로그래밍 패러다임을 지원합니다. Java 8 이상에서 함수형 인터페이스는 주로 스트림 API, 병렬 처리 등에 활용됩니다.

주요 특징
단 하나의 추상 메소드: 함수형 인터페이스는 정확히 하나의 추상 메소드를 가져야 합니다. 이는 인터페이스가 람다 표현식의 타겟 타입으로 사용될 수 있음을 의미합니다.
@FunctionalInterface 어노테이션: 이 어노테이션은 인터페이스가 함수형 인터페이스임을 명시적으로 선언합니다. 컴파일러는 이 어노테이션이 붙은 인터페이스가 정확히 하나의 추상 메소드만을 가지고 있는지 검사합니다. 어노테이션은 선택적이지만, 가독성과 안정성을 높이는 데 도움을 줍니다.
디폴트 메소드와 정적 메소드: 함수형 인터페이스는 하나의 추상 메소드를 가지고 있어야 하지만, 디폴트(default) 메소드나 정적(static) 메소드는 여러 개 가질 수 있습니다. 이 메소드들은 구현을 제공하기 때문에 함수형 인터페이스의 정의를 위반하지 않습니다.


자바 내장 함수형 인터페이스
Java는 java.util.function 패키지를 통해 다양한 함수형 인터페이스를 제공합니다. 

 

 

1. Predicate<T>

    두 개의 인수에 대한 boolean 결과 값을 나타냅니다. 

    boolean test(T t, U u)

Predicate<Integer> isEven = (number) -> number % 2 == 0;
System.out.println(isEven.test(4)); // true
System.out.println(isEven.test(5)); // false

 

2. BiConsumer<T, U>:
    두 개의 입력 인수를 받고 결과를 반환하지 않는 작업을 나타냅니다.
    void accept(T t, U u)

Map<String, Integer> ages = new HashMap<>();
BiConsumer<String, Integer> addAge = (name, age) -> ages.put(name, age);
addAge.accept("Alice", 25);
addAge.accept("Bob", 30);
System.out.println(ages); // {Alice=25, Bob=30}

 

3. BiFunction<T, U, R>:
    두 개의 인수를 받고 결과를 생성하는 함수를 나타냅니다.
    R apply(T t, U u)

BiFunction<String, Integer, String> formatString = (name, age) -> "Name: " + name + ", Age: " + age;
System.out.println(formatString.apply("Alice", 25)); // Name: Alice, Age: 25

 

4. BiSupplier<T, U>:

    결과를 공급하는 공급자를 나타냅니다.
    T get(U u)

BiFunction<Integer, Integer, Integer> addFunction = (a, b) -> a + b;
int sum = addFunction.apply(3, 4);
System.out.println("Sum: " + sum);

 

5. Consumer<T>:

    하나의 인수를 받아 결과를 반환하지 않는 작업을 나타냅니다.
    void accept(T t)

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Consumer<String> printUpperCase = (name) -> System.out.println(name.toUpperCase());
names.forEach(printUpperCase);

 

6. Supplier<T>:

    결과를 공급하는 공급자를 나타냅니다.
    T get()

Supplier<LocalDate> currentDate = () -> LocalDate.now();
System.out.println("Current date: " + currentDate.get());

 

7. Function<T, R>:

    하나의 인수를 받아 결과를 생성하는 함수를 나타냅니다.
    R apply(T t)

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Consumer<String> printUpperCase = (name) -> System.out.println(name.toUpperCase());
names.forEach(printUpperCase);

 

8. BiPredicate<T, U>: 

    두 개의 인수에 대한 boolean 결과 값을 나타냅니다.

    boolean test(T t, U u)

BiPredicate<String, Integer> isLengthGreaterThan = (str, length) -> str.length() > length;
System.out.println(isLengthGreaterThan.test("Java", 3)); // true

 

9. UnaryOperator<T>:
    단일 피연산자에 대한 작업을 나타내며 피연산자와 동일한 유형의 결과를 생성합니다.
    T apply(T t)

UnaryOperator<Integer> square = (number) -> number * number;
System.out.println(square.apply(5)); // 25

 

10. BinaryOperator<T>:
    동일한 유형의 두 피연산자에 대한 작업을 나타내며 피연산자와 동일한 유형의 결과를 생성합니다.
    T apply(T t1, T t2)

BinaryOperator<Integer> add = (a, b) -> a + b;
System.out.println(add.apply(3, 4)); // 7



함수형 인터페이스는 Java에서 람다 표현식의 기반을 형성하며, 모던 자바의 중요한 부분입니다. 이를 통해 개발자는 보다 선언적이고 간결한 방식으로 코드를 작성할 수 있습니다.

반응형

+ Recent posts