포스트

함수형 인터페이스

함수형 인터페이스

기본 함수형 인터페이스

Function

  • 입력 O, 반환 O
  • 데이터 변화, 필드 추출 등
1
2
3
4
5
6
@FunctionalInterface
public interface Function<T, R> {
  R apply(T t);
		...
}

Consumer

  • 입력 O, 반환 X
  • 로그 출력, DB 저장 등
1
2
3
4
5
6
@FunctionalInterface
public interface Consumer<T> {
  void accept(T t);
}

Supplier

  • 입력 X, 반환 O
  • 객체 생성, 값 반환 등
1
2
3
4
5
@FunctionalInterface
public interface Supplier<T> {
  T get();
}

Runnable

  • 입력 X, 반환 X
  • 스레드 실행(멀티스레드)
1
2
3
4
5
@FunctionalInterface
public interface Runnable {
  void run();
}

특화 함수형 인터페이스

Predicate

  • 입력 O, 반환 boolean
  • 조건 검사, 필터링 용도
1
2
3
4
5
@FunctionalInterface
public interface Predicate<T> {
  boolean test(T t);
}

Function쓰면 되는데 굳이 필요할까?

  • 의미의 명확성
    • 이 함수는 조건을 검사하거나 필터링 요도로 쓰인다는 의도가 분명해 짐
  • 가독성 및 유지 보수성
    • 조건을 판단하는 함수는 Predicate<T> 라는 패턴을 사용함으로써 의미 전달이 명확
    • boolean 판단 로직이 들어가는 부분에서 Predicate<T>를 사용하면 코드 가독성과 유지 보수성이 향상 됨
      • 이름도 명시적이고, 제네릭에 Boolean을 적지 않아도 됨

Operator

  • 같은 타입의 값들을 받아서 동일한 타입의 결과를 반환

UnaryOperator(단항 연산)

  • 하나의 피연산자에 대해 연산을 수행하는 것을 의미
  • 입력과 결과가 동일한 타입인 연산을 수행할 때 사용
1
2
3
4
@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {
}

BinaryOperator(이항 연산)

  • 두 개의 피연산자에 대해 연산을 수행하는 것을 의미
  • 같은 타입의 두 입력을 받아, 같은 타입의 결과를 반환할 때 사용
1
2
3
4
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T, T, T> {
}

기타 함수형 인터페이스

입력 값이 2개 이상

  • 매개 변수가 2개 이상 필요한 경우에는 BiXxx 시리즈를 사용하면 됨

입력 값이 3개 이상

  • 지원하지 않으므로 직접 함수형 인터페이스를 만들어서 사용

기본형 지원 함수형 인터페이스

기본형 지원 함수형 인터페이스가 존재하는 이유

  • 오토박싱/언박싱으로 인한 성능 비용을 줄이기 위해
  • 자바 제네릭의 한계를 극복하기 위해

Function

  • IntFunction: 매개현수가 기본형 int
  • ToIntFunction: 반환 타입이 기형 Int
  • IntToLongFunction: 매개 변수가 Int, 반환 타입이 long

기타

  • IntOperator
  • IntConsumer
  • IntSupplier
  • IntPredicate

참고

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.