람다 표현식의 동작과정
람다 표현식이 어떻게 동작하는지 알아보겠습니다.
우선 람다식을 적용하는 곳은 메서드에서 함수형 인터페이스를 매개변수로 갖는 메서드입니다.
결론부터 말하면 람다 표현식의 형태를 보고 어떤 함수형 인터페이스에 해당하는지 확인하는 것입니다.
우선 자바에서 정의한 함수형 인터페이스에는 Predicate/Consumer/Function등이 있습니다.
동작과정
1.람다표현식을 본 프로그램은 처음에 람다식이 사용된 Context를 확인합니다.
단순하게 람다식이 표현된 위치를 확인하는 것입니다.
2. 해당 메서드의 정의부분에서 람다표현식 위치에 있는 함수형 인터페이스의 형태(대상 형식)를 확인합니다.
3. 대상형식은 자바에서 정의한 함수형 인터페이스중 어떤 것에 속하는지를 확인하는 것입니다.
4. 예를 들어 만약 반환형이 boolean이라면 Predicate에 해당됩니다.
5. 대상 형식을 확인했다면 해당 함수형 인터페이스의 추상메서드를 확인합니다.
6. 해당 추상메서드의 Generic타입을 해당하는 객체형으로 변경한뒤 람다 표현식에 있는 시그니처(인수와 반환형 형태)
를 비교해 일치하는지 검사합니다.
위와 같은 과정이 끝나면 람다 표현식의 결과가 나와서 메서드가 동작됩니다.
메서드 Reference
메서드 레퍼런스는 람다 표현식에서 특정 메서드만을 호출하는 람다의 축약형입니다.
즉 람다식에서 함수를 1개만 호출할 대 사용가능합니다.
쉽게 말하자면 메서드 호출을 할 때 호출할 메서드를 설명하는 것보다는 메서드명으로만 호출하는 것이 더 간단하고 가독성이 좋습니다. 메서드 레퍼런스는 메서드명으로 함수를 호출하는 방법입니다.
예를 들어 (Apple a) ->a.getWeight()는 메서드의 설명을 해서 호출하는 것입니다.
메서드 레퍼런스의 경우 Apple::getWeight로 표현할 수 있습니다.
또한 생성자도 레퍼런스로 생성할 수 있습니다. Apple::new로 인스턴스를 생성할 수 있습니다.
메서드 레퍼런스의 3가지 형태가 있습니다.
- 스태틱 메소드 참조 (Static Method Reference) → 클래스::정적메소드 (static)
- 특정 객체의 인스턴스 메소드 참조 (Instance Method Reference) → 객체::인스턴스메소드 (public)
- 생성자 참조 (Constructor Method Reference) → 클래스::new