본문 바로가기

Java

람다 표현식 - 2. 자바 함수형 인터페이스

자바 함수형 인터페이스란 단 하나의 추상 메서드를 가지고 있는 인터페이스이다.

자바 표준 라이브러리에는 여러 유용한 함수형 인터페이스들이 포함되어 있다. 그 중 가장 기본적인 함수형 인터페이스는 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