• 자바 - 함수형 인터페이스

    2025. 1. 21.

    by. Daramu

    자바는 구체적인 타입을 필요로하는 엄격한 언어이다.

    그렇기에 java.util.function 패키지를 통해 40개 이상의 함수형 인터페이스를 제공한다.

     

    각각 아래와 같이 존재한다.

    1. Function - 인수를 받고 결과를 반환

    2. consumer - 인수만 받고 결과를 반환하지 않음

    3. Supplier - 인수를 받지 않고 결과만 반환

    4. Predicate - 인수를 받아 표현식에서 테스트하고 boolean값 리턴

     

    1. Function

    가장 중요한 함수형 인터페이스 중 하나이다. 하나의 입력과 출력을 가진 전통적인 함수를 의미하며, 하나의 입력값을 받아 하나의 출력값을 내는 함수의 대표격이다.

     

    T ---> [Function<T,R] ----->R

     

    Function<T,R> 의 단일 추상 메서드는 apply로  T타입의 인수를 받아 R타입의 결과를 생성한다.

    @FunctinalInterface
    public interface Function<T,R> {
    	R apply(T t);
    }

     

    다음은 문자열의 null체크 후 길이를 반환하는 코드이다.

    Function <String, Integer> stringLength = str -> str != mull ? str.length(): 0;
    Integer result = stringLength.apply("Hello. Worl!");
    //문장 마지막 d가 없어보이겠지만 무시해달라...ㅠ

     

     

    2. Consumer

    Consumer는 입력 파라미터를 소비하지만 아무것도 반환하지 않는다.

    핵심인 java.util.function.Con-suner<T>는 아래와 같다.

     

    T ----> [Consumer<T>]

     

    Cunsumer<T>의 단일 추상 메서드는 accept로, T타입의 인수가 필요하다.

    @functionalInterface
    public interface Consumer<T>{
    	void accept(T t);
    }

     

    아래의 코드는 String을 소비(Consumer)하여 출력한다.

    Consumer<String> println = str -> System.out.println(str);
    println.accept("Hello, Consumer!");

     

    값의 소비만을 위한 순수한 소비(Consumer)형 함수에 부합하지 않겠지만, 어찌되었든 위와같이 동작하는 핵심이 중요한 것 같다.

     

    3. Supplier

    Supplier은 Consumer와 반대로, 함수형 인터페이스는 java.util.function.Supplier<T>타입을 기반으로 한다.

    어떠한 입력값도 받지 않지만 T타입의 단일 반환값을 반환하다.

     

    [Supplier<T>] ---> T

     

    추상메서드는 get으로 정의된다.

    @FunctionalInterface
    public interface Supplier<T> {
    	T get();
    }

     

    다음 Supplier<Double>은 get()은 호출할 때마다 새로운 랜덤값을 출력한다.

    Supplier<Double> random = () -> Math.random();
    Double result = random.get();

     

    Supplier는 종종 지연 실행에 사용된다.

    예를들어 비용이 많이 들어가는 작업을 Supplier로 래필하고, 필요할때만 get을 호출하는 경우이다.

     

    4. Predicate

    Predicate는 단일 인수를 받아 그것을 로직에서 테스트하고, 그 결과에 따라 true, false값을 리턴하는 함수이다.

    java.util.function.Predicate<T>구문은 아래와 같다.

     

    T -----> [Predicate<T>] ----> boolean

     

    Predicate<T>의 단일 추상 메서드는 test로, T타입의 인수를 받아 boolean타입을 반환한다.

     

    @FunctionalInterface
    public interface Predicate<T> {
    	boolean test(T t);
    }

     

    Predicate는 필터(filter)와 같이 의사 결정에 주로 사용된다.

    아래의 코드는 Integer가 9000을 초과하는지 '테스트'한다.

     

    Predicate<Integer> over9000 = i -> i > 9_000;
    boolean result = over9000.test(12_345);

     

     

     

     

    'Devloper > 자바JAVA' 카테고리의 다른 글

    자바 - 람다(Lambda) 문법 & 메서드 참조(::)  (0) 2025.01.31
    자바 - 스트림(Stream)  (0) 2025.01.23
    자바 - 레코드(Record)  (0) 2025.01.23

    댓글