Language/Java

함수형 인터페이스와 람다식, 메서드 참조

kimjingyu 2023. 5. 24. 23:00
728x90

✏️ 함수형 인터페이스

  • 함수형 인터페이스란 하나의 추상 메서드를 갖는 인터페이스를 말한다.
  • 자바 8 이후부터는 함수형 인터페이스를 나타내는 @FuncionalInterface 내장 애노테이션을 사용할 수 있다.
    • 이 애노테이션은 컴파일 타임에 해당 인터페이스가 함수형 인터페이스가 맞는지 검사할 때, 유용하게 사용할 수 있다.
  • 함수형 인터페이스에는 하나의 추상 메서드 외에도 여러 개의 디폴트 메서드나 정적 메서드가 있을 수 있다.
  • 예외적으로 java.lang.Object 클래스에 선언된 public 메서드를 오버라이딩하는 메서드는 인터페이스의 추상 메서드에 포함시키지 않는다.
@FunctionalInterface
interface MyFunctionalInterface {
    void foo();
    default void bark() { /*..*/ }
    static void fly() { /*..*/ }
}

🗒️ 자주 사용되는 형태의 함수형 인터페이스

Function<T, R>

  • T: 인수 타입, R은 반환형
  • 하나의 값을 인수로 전달하면 어떤 값을 반환
  • R apply(T t);
  • 인수나 반환형에 기본 타입을 사용하고 싶은 경우
    • public interface IntToLongFunction { long applyAsLong(int value); }
  • 한개의 인수가 아닌 두개의 인수를 받고 싶을 때는 BiFunction 같이 접두사 Bi를 붙이면 된다.
    • public interface BiFunction<T, U, R> { R apply(T t, U u); }

Supplier<T>

  • T get();
  • 결과 반환

Consumer<T>

  • 어떤 인수를 받고서 아무런 결과도 반환하지 않을 때
  • void accept(T t);
  • BiConsumer<T, U> -> 접두사 Bi를 붙이면 두 개의 인수를 받을 수 있다.

Predicate<T>

  • predicate(술어)란 인수와 관련된 어떤 조건을 검사하여 해당 조건을 만족하면 참을 반환하고, 아니면 거짓을 반환하는 메서드를 말한다.
  • BiPredicate<T, U> 처럼 앞에 접두사를 붙이면 인수 두개를 받을 수 있다.
Predicate<String> isEmptyString = string -> string.length() == 0;

System.out.println(isEmptyString.test("ABC"));
System.out.println("isEmptyString.test = " + isEmptyString.test(""));

Predicate<String> isNotEmptyString = isEmptyString.negate();

System.out.println("isNotEmptyString.test(\"ABC\") = " + isNotEmptyString.test("ABC"));
System.out.println("isNotEmptyString.test(\"\") = " + isNotEmptyString.test(""));

🔎 람다식

  • 람다식은 이름이 없는 익명 메서드라고 말 할 수 있으며, 조금 더 자세히 말하면 함수형 인터페이스에 있는 추상 메서드를 구현하기 위해서 사용된다고 말할 수 있다.

📌 메서드 참조 ( Method Reference )

  • 기존 메서드에 대한 참조를 말하는 것으로 함수형 인터페이스를 구현하는 클래스나 람다식 대신에 메서드 참조를 사용할 수 있다.
  • 람다 본체가 어떤 메서드 하나를 호출하는 것에 그친다면 메서드 참조를 동해서 축약할 수 있다.
  • 메서드 참조는 함수형 인터페이스의 추상 메서드 시그니처와 호환이 되어야 한다.

사용 방법

  1. 정적 메서드 참조
    • 클래스명::정적메서드명
  2. 특정 객체의 인스턴스 메서드 참조
    • 특정객체::메서드명
    • myApp::appendStrings2
  3. 특정 타입의 인스턴스 메서드 참조
    • 특정타입::메서드명(인스턴스 메서드)
    • String::concat
  4. 생성자 참조
    • 클래스명::new
    • HashSet::new
인용

https://blog.hexabrain.net/382

 

32편. 람다식(Lambda expression)

함수형 인터페이스(Functional Interface) 람다식을 이해하기 전에 함수형 인터페이스에 대한 이해가 필요합니다. 함수형 인터페이스(Funcational Interface)란 하나의 추상 메서드를 갖는 인터페이스를 말

blog.hexabrain.net

 

728x90