woowacourse-study / 2022-modern-java-in-action

우아한테크코스 4기 모던 자바 인 액션 스터디
10 stars 4 forks source link

람다는 뭐길래 매개변수로 넘길 수 있는가? #16

Open injoon2019 opened 2 years ago

injoon2019 commented 2 years ago

문제

책의 예시에 보면 ApplePredicate가 들어가야하는 자리에 그냥 람다식을 넣는다. 람다는 왜 이렇게 자유롭게 들어갈 수 있는가?

선정 배경

책에서는 자세히 나와있지 않아 헷갈렸다. 갑자기 왜 ApplePredicate 를 구현한 클래스들이 들어가다가 아무런 연관이 없어보이는 람다식이 들어갈 수 있는 것인지. 그래서 그 이유에 대해 궁금했다.

관련 챕터

[2장] 동작 파라미터화 코드 전달하기

injoon2019 commented 2 years ago

여섯 번째 시도: 람다 표현식 사용

List<Apple> result = filterApples(inventory, (Apple apple) -> RED.equals(apple.getColor()));

람다식은 익명 클래스 객체와 동등하다.

(int a, int b) -> a > b ? a : b
new Object() {
    int max(int a, int b) {
        return a > b ? a : b;
    }
}

위의 max는 임의로 붙인것이고 의미는 없다.

람다식으로 정의된 익명 객체의 메서드를 호출하려면 참조변수가 있어야 한다. 이 참조변수는 람다식과 동등한 메서드가 정의되어 있어야 한다.

interface MyFunction {
    public abstract int max(int a, int b);
}

이 인터페이스를 구현한 익명 클래스의 객체

MyFunction f = new MyFunction() {
                              public int max(int a, int b) {
                                  return a > b ? a : b;
                              }
                          };

익명 객체를 람다식으로 대체가 가능한 이유는, 람다식도 실제로는 익명 객체이고, 인터페이스의 메서드와 람다식의 매개변수의 타입과 개수 그리고 반환값이 같기 때문에 가능.

람다식을 다루기 위한 인터페이스를 함수형 인터페이스라고 부르며, 함수형 인터페이스에는 오직 하나의 추상 메서드만 정의되어 있어야 한다.