2 minute read

목표

자바의 람다식에 대해 학습하세요.

학습할 것 (필수)

람다식 사용법

람다 표현식: 메서드로 전달할 수 있는 익명 함수를 단순화한 것. 람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있다.

람다 특징

  • 익명 보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다.

  • 함수 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함한다.

  • 전달 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다.

  • 간결성 익명 클래스처럼 많은 자질구레한 코드를 구현할 필요가 없다.

람다 표현식은 세부분으로 이루어진다.

(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
  • 파라미터 리스트: Comparator의 compare 메서드 파라미터(사과 두 개)
  • 화살표: 화살표(->)는 람다의 파라미터 리스트와 바디를 구분한다.
  • 람다 바디: 두 사과의 무게를 비교한다. 람다의 반환값에 해당하는 표현식이다.

자바 8에서 지원하는 다섯 가지 람다 표현식 예제

(String s) -> s.length() // 1
(Apple a) -> a.getWeight() > 150 // 2
(int x, int y) -> { // 3
    System.out.println("Result: ");
    System.out.println(x + y);
}
() -> 42 // 4
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()) // 5
  1. String 형식의 파라미터 하나를 가지며 int를 반환한다. 람다 표현식에는 return이 함축되어 있으므로 return문을 명시적으로 사용하지 않아도 된다.
  2. Apple 형식의 파라미터 하나를 가지며 boolean(사과가 150그램 보다 무거운지 결정)을 반환한다.
  3. int 형식의 파라미터 두 개를 가지며 리턴값이 없다(void 리턴). 이 예제에서 볼 수 있듯이 람다 표현식은 여러 행의 문장을 포함할 수 있다.
  4. 파라미터가 없으며 int 42를 리턴한다.
  5. Apple 형식의 파라미터 두개를 가지며 int(두 사과의 무게 비교 결과)를 반환한다.

람다 기본 문법

(parameters) -> expression

// or

(parameters) -> { statements; } // 블록 스타일(block-style)

람다 예제

사용 사례 람다 예제
불리언 표현식 (List list) -> list.isEmpty()
객체 생성 () -> new Apple(10)
객체에서 소비 (Apple a) -> { System.out.println(a.getWeight()); }
객체에서 선택/추출 (String s) -> s.length()
두 값을 조합 (int s, int b) -> a * b
두 객체 비교 (Apple a1, Apple a2) -> a1.getWeight().compateTo(a2.getWeight())

함수형 인터페이스

  • 함수형 인터페이스: 하나의 추상 메서드를 지정하는 인터페이스
public interface Predicate<T> {
    boolean test(T t);
}

람다 표현식으로 함수형 인터페이스의 추상 메서드 구현을 직접 전달할 수 있으므로 전체 표현식을 함수형 인터페이스의 인스턴스로 취급(기술적으로 따지면 함수형 인터페이스를 구현한 클래스의 인스턴스)할 수 있다.

  • 함수 디스크립터(Function Descriptor): 람다 표현식의 시그니처를 서술하는 메서드, 함수형 인터페이스의 추상 메서드 시그니처 Runnable 인터페이스의 유일한 추상 메서드 run은 인수와 반환값이 없으므로(void 반환) Runnable 인터페이스는 인수와 반환값이 없는 시그니처로 생각할 수 있다.

자바 8 라이브러리에는 java.util.function 패키지로 여러 가지 새로운 함수형 인터페이스를 제공한다.

Variable Capture

람다 시그니처의 파라미터로 넘겨진 변수가 아닌 외부에서 정의된 변수를 자유 변수(Free variable)이라고 부르며, 람다 바디에서 자유 변수를 참조하는 행위가 람다 캡처링이다.

람다 캡처링의 제약 조건

  1. 지역변수는 final로 선언되어 있어야 한다.
  2. final로 선언되지 않은 지역변수는 final처럼 동작해야 한다. (값의 재할당이 일어나면 안된다.)

메소드, 생성자 레퍼런스

메서드 참조(Method reference): 람다 표현식이 단 하나의 메서드만을 호출하는 경우에 해당 람다 표현식에서 불필요한 매개변수를 제거하고 사용할 수 있도록 해준다.

메서드 참조를 사용하면 불필요한 매개변수를 제거하고 다음과 같이 ‘::’ 기호를 사용하여 표현할 수 있다.

클래스이름::메서드이름
or
참조변수이름::메서드이름

생성자 참조: 생성자를 호출하는 람다 표현식도 메서드 참조를 이용할 수 있다. 즉, 단순히 객체를 생성하고 반환하는 람다 표현식은 생성자 참조로 변환할 수 있다.


참고 서적

모던 자바 인 액션


live-study with whiteship