본문 바로가기

이펙티브 자바

[이펙티브 자바] 아이템44. 표준 함수형 인터페이스를 사용하라

표준 함수형 인터페이스(Standard Functional Interfaces) : 자바에서 함수형 프로그래밍을 지원하기 위해 미리 정의된 인터페이스들을 말한다. 이러한 인터페이스들은 자주 사용되는 함수형 작업을 수행하기 위해 특별히 설계되었으며, 자바에서 람다 표현식과 함께 주로 사용된다.

 

자바 8에서는 java.util.function 패키지에 표준 함수형 인터페이스들이 정의되어 있다. 이러한 인터페이스들은 주로 함수형 인터페이스를 사용하는 메서드의 매개변수나 반환값으로 사용된다. 주요 표준 함수형 인터페이스들은 다음과 같다:

  • Consumer<T>: 단일 입력 매개변수를 받고, 반환값이 없는 동작을 수행한다. (void accept(T t))
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        // 문자열을 출력하는 Consumer
        Consumer<String> printer = str -> System.out.println(str);
        
        // 사용 예시
        printer.accept("Hello, world!");
    }
}

 

  • Function<T, R>: 입력 값을 받아 다른 타입의 결과 값을 반환합니다. (R apply(T t))
import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        // 문자열의 길이를 반환하는 Function
        Function<String, Integer> stringLength = str -> str.length();
        
        // 사용 예시
        int length = stringLength.apply("Hello, world!");
        System.out.println("Length: " + length);
    }
}
  • Predicate<T>: 입력 값을 받아 조건을 검사하고 boolean 값을 반환합니다. (boolean test(T t))
import java.util.function.Predicate;

public class Main {
    public static void main(String[] args) {
        // 짝수 여부를 판별하는 Predicate
        Predicate<Integer> isEven = num -> num % 2 == 0;
        
        // 사용 예시
        boolean result = isEven.test(4);
        System.out.println("Is even? " + result); // true
    }
}
  • Supplier<T>: 매개변수가 없고, 반환값을 생성하는 동작을 수행합니다. (T get())
import java.util.function.Supplier;

public class Main {
    public static void main(String[] args) {
        // 현재 시간을 제공하는 Supplier
        Supplier<Long> currentTime = () -> System.currentTimeMillis();
        
        // 사용 예시
        long time = currentTime.get();
        System.out.println("Current time: " + time);
    }
}
  • UnaryOperator<T>: 단일 입력 값을 받아 동일한 타입의 결과 값을 반환합니다. (T apply(T t))
  • BinaryOperator<T>: 두 개의 입력 값을 받아 동일한 타입의 결과 값을 반환합니다. (T apply(T t1, T t2))

 

핵심정리 : 이제 자바도 람다를 지원한다. 여러분도 지금부터는 API를 설계할 때 람다도 염두에 두어야 한다는 뜻이다. 입력값과 반환값에 함수형 인터페이스 타입을 활용하라. 보통은 java.util.function 패키지의 표준 함수형 인터페이스를 사용하는 것이 가장 좋은 선택이다. 단, 흔치는 않지만 직접 새로운 함수형 인터페이스를 만들어 쓰는 편이 나을 수도 있음을 잊지 말자.