Skip to content

Latest commit

 

History

History
70 lines (51 loc) · 3.18 KB

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

File metadata and controls

70 lines (51 loc) · 3.18 KB

가능하다면 표준 함수형 인터페이스를 사용하라

  • 함수형 인터페이스란?

    • 1개의 추상 메소드만 가지는 인터페이스 (SAM)
    • 자바에서 람다식은 함수형 인터페이스를 통해서만 사용가능!
    // 함수형 인터페이스 예시
    
    public interface FunctionalInterface {
         public abstract void run(String input);
    }
    
    FunctionalInterface funcInt = input -> System.out.println(input); // 재정의
    funcInt.run("This is functional interface"); // 호출
  • 표준 함수형 인터페이스

    • java.util.function 패키지에 43개의 표준 함수형 인터페이스가 정의되어 있다.
    • 기본 인터페이스

    | 기본 인터페이스 | 추상 메소드 | 예시 | | --- |---------------------| --- | | UnaryOperator | T apply(T t) | String::toLowerCase | | BinaryOperator | T apply(T t1, T t2) | BigInteger::add | | Predicate | boolean test(T t) | Collection::isEmpty | | Function<T,R> | R apply(T t) | Arrays::asList | | Supplier | T get() | Instant::now | | Consumer | void accept(T t) | System.out::println |

    • 기본 인터페이스에서 입력 타입 또는 반환 타입을 특정하거나, 입력 인수의 개수를 바꾼 변형이 존재하여, 총 43개의 표준 함수형 인터페이스가 존재한다.
    • ex) Predicate → IntPredicate, BinaryOperator → LongBinaryOperator, Function<T,R> → Function<T,U,R>
  • 표준 함수형 인터페이스의 장점

    • 직접 구현할 필요가 없어서 편하고, 코드의 구조가 간단해진다.
    • 기본 추상 메소드 외에도 유용한 디폴트 메소드들이 많이 정의되어 있다.
    • 직접 작성할 때의 위험성을 없앨 수 있다. (ex. 추상 메소드가 두개라던지...)
  • 굳이 새로운 함수형 인터페이스를 구현해서 써야 하는 경우

    • 사용 빈도가 높고, 이름이 직관적인 경우.
    • 필수적으로 요구되는 규약이 있는 경우.
    • 별도의 디폴트 메소드가 정의되어 있는 경우. (라이브러리에 포함된 경우)
    • ex) Comparator : 표준 함수형 인터페이스인 ToIntBiFunction<T,U>와 동일한 구조임에도 별도로 정의된 라이브러리가 존재한다.
    // Comparator 인터페이스
    
    @FunctionalInterface
    public interface Comparator<T> {
    	
    	public abstract int compare(T o1, T o2);
    
    	// 이외에 17개의 다른 메소드가 정의되어 있다. 
    }
    
    // 사용
    Comparator comparator = (o1, o2) -> o2-o1;
    int result = comparator.compare(a, b);
  • 정리

    • 람다식을 쓰려면 함수형 인터페이스를 써야 한다.
    • java.util.function 패키지에 43개 타입의 표준 함수형 인터페이스가 정의되어 있다. 가급적이면 표준 함수형 인터페이스를 사용하라. 쉽고 유용하다.
    • 직접 새로운 함수형 인터페이스를 정의해서 사용해야 할 수도 있는데, 이 때는 반드시 @FunctionalInterface 애너테이션을 붙여라.
  • 참조