44. 표준 함수형 인터페이스를 사용하라

신명철·2022년 3월 10일
0

Effective Java

목록 보기
42/80

함수형 인터페이스 ?

추상 메서드를 딱 하나만 갖고 있는 인터페이스를 말한다. Single Abstract Method 라고 불리기도 한다. 다음 코드를 보자.

@FunctionalInterface
public interface MyRunnable {
    void doSomething(); 
    
    static void printName() {
    	System.out.println("NAME");
    }
    
    default void printAge() {
    	System.out.println("Age");
    }
}
  • 위 코드는 static, default 메서드와 상관없이 추상 메서드가 하나만 존재하기 때문에 함수형 인터페이스라고 할 수 있다.
  • 그 자리가 어떤 객체 타입의 메서드인지 추론이 가능하기 때문에 람다식을 사용할 수 있게 된다.
  • 만약, 두 개의 추상 메서드가 있다면 어떤 메서드인지 구분할 수 없어 람다식을 사용할 수 없다.

표준 함수형 인터페이스

자바는 다양한 함수형 인터페이스들을 제공한다. 다음 표가 그 예이다.

인터페이스함수 시그니처
UnaryOperatorT apply(T t)String::toLowerCase
BinaryOperatorT apply(T t1, T t2)BigInteger::add
Predicateboolean test(T t)Collection::isEmpty
Function<T,R>R apply(T t)Arrays::asList
SupplierT get()Instant::now
Consumervoid accept(T t)System.out::println

표준 함수형 인터페이스의 대부분은 기본 타입만 지원한다. 그렇다고 기본 함수형 인터페이스에 박싱된 기본 타입을 넣어서 사용하지는 말자. 표준 함수형 인터페이스는 대부분의 상황을 제공한다.

함수형 인터페이스를 작성해야 하는 경우

  • 자주 쓰이고 이름 자체가 용도를 명확히 설명해준다.
    • 예를 들어, Comparator와 ToIntBiFunction<T, U>가 있다. Comparator가 ToIntBiFunction<T, U> 보다 명확하다.
  • 반드시 따라야 하는 규약이 있다.
  • 유용한 디폴트 메소드를 제공할 수 있다.

@FunctionalInterface

@FunctionalInterface를 사용하는 이유는 세 가지가 있다.

  • 해당 클래스의 코드나 설명 문서를 읽을 이에게 그 인터페이스가 람다용으로 설계되었음을 알려준다.
  • 해당 인터페이스가 추상 메섣르르 오직 하나만 가지고 있어야 컴파일되게 알려준다.
  • 유지보수 과정에서 누군가 실수로 메서드를 추가하지 못하도록 막아준다.

위와 같은 이점을 누리기 위해 직접 만든 함수형 인터페이스에는 항상 @FunctionalInterce를 사용하도록 하자.

서로 다른 함수형 인터페이스를 같은 위치의 인수로 받는 메서드들을 다중 정의해서는 안된다. 클라이언트에게 불필요한 모호함만 줄 뿐, 이로 인해서 실제로 문제가 일어나기도 한다.

profile
내 머릿속 지우개

0개의 댓글