본문 바로가기
Back-end/Java

Java의 Functional Interface

by whatamigonnabe 2023. 4. 27.

Functional Interface란?

Java8부터 함수형 패러다임을 적용하기 위해 적용된 기능으로 Lamda Expression 또는 method reference를 이용하여 구현됩니다.

Lamda Expression이란?

람다 표현식은 익명 함수를 보다 간결하고 가독성있게 표현하는 문법입니다. 기본적으로 아래와 같은 형태로 사용합니다.
(매개 변수 목록) -> (실행문)

Method Referece란?

메서드 참조란 람다 표현식을 더욱 간결하고 가독성있도록 표현하는 문법입니다. 아래와 같은 방법으로 사용할 수 있습니다.

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// Lambda expression 사용
names.forEach(name -> System.out.println(name));

// Method Reference 사용
names.forEach(System.out::println);

Function

Function 인터페이스 중 하나인 Function에 대해 살펴보겠습니다.
기본적인 형태는 다음과 같습니다.

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

위에서 제너릭 T 타입의 매게 변수 하나를 받아 제너릭 R 타입 하나를 리턴합니다. 아래와 같은 방법으로 사용할 수 있습니다.

Function<Integer, Integer> square = x -> x * x;
Function<Integer, Integer> add = x -> x + 2;
int result = square.andThen(add).apply(5); // 결과: 27

andThen() 메서드를 통해 함수를 연속해서 사용할 수 있습니다.

Function 인터페이스를 사용하는 예시로는 Optional 클래스의 map을 보겠습니다.

public <U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    Objects.requireNonNull(mapper);
    if (!isPresent()) {
        return empty();
    } else {
        return Optional.ofNullable(mapper.apply(value));
    }
}

Function 익명함수인 mapper를 매개 변수로 받아, Optional의 value가 있을 경우에 apply 메서드를 mapper를 실행한 리턴값을 리턴하고 있습니다.

Supplier

SupplierFunciotn과 다르게 매개변수를 받지 않고 리턴만 합니다. Supplier 인터페이스는 다음과 같습니다

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

Supplier를 적용한 예시는 Optional의 or 메서드가 있습니다.

public T orElseGet(Supplier<? extends T> supplier) {
    return value != null ? value : supplier.get();
}

Optional의 value가 null일 경우 supplier 객체를 실행한 리턴값을 반환합니다.

Consumer

Consumer는 매개변수를 받지만 리턴 값이 없는 인터페이스로 아래와 같습니다.

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
    // ...
}

Optional의 ifPresent 메서드가 이 인터페이스 객체를 인자로 가집니다.

public void ifPresent(Consumer<? super T> action) {
    if (value != null) {
        action.accept(value);
    }
}

지금까지 Functional Interface에 대해서 알아봤습니다. 그냥 사용하고 있었는데, 종류와 특징에 대해 알게되는 좋은 기회였습니다.