람다보다도 더 함수 객체를 간결하게 만드는 방법이 메서드 참조(method reference)다.
어떤 람다에서는 매개변수의 이름 자체가 프로그래머에게 좋은 가이드가 되기도 한다.
이런 람다는 길이는 더 길지만 메서드 참조보다 읽기 쉽고 유지보수도 쉬울 수 있다.
람다로 할 수 없는일이라면 메서드 참조로도 할 수 없다.
메서드 참조의 5가지 유형
1. 정적 메서드를 가리키는 메서드 참조
2. 인스턴스 메서드를 참조하는 수신 객체(참조 대상 인스턴스)를 특정하는 한정적 인스턴스 메서드 참조
- Calculator의 인스턴스를 생성하고 해당 인스턴스를 사용하여 한정적 인스턴스 메서드 참조를 생성한다.
- addFunction은 Calculator의 add 메서드를 참조하고 있으며 subtractFunction은 Calculator의 subtract 메서드를 참조하고 있다. 이렇게 한정적 인스턴스 메서드 참조를 생성하면, 수신 객체가 해당 인스턴스인 것을 명시적으로 나타낼 수 있다.
3. 인스턴스 메서드를 참조하는 수신 객체를 특정하지 않는 비한정적 인스턴스 메서드 참조
- 비한정적 참조에서는 함수 객체를 적용하는 시점에 수신 객체를 알려준다.
- 이를 위해 수신 객체 전달용 매개변수가 매개변수 목록의 첫 번째로 추가되며, 그 뒤로는 참조되는 메서드 선언에 정의된 매개변수들이 뒤따른다.
4. 클래스 생성자를 가리키는 메서드 참조
- MyClass::new;는 MyClass의 생성자를 가리키는 메서드 참조를 정의하고 있다.
- constructor.apply("Example")를 호출하여 MyClass의 인스턴스를 생성하고 "Example"을 인자로 전달하여 초기화한다.
5. 배열 생성자를 가리키는 메서드 참조
- String[]::new는 String 배열 생성자를 가리키는 메서드 참조를 정의하고 있다.
- arrayConstructor.apply(5)를 호출하여 String 배열의 인스턴스를 생성하고, 길이를 5로 지정한다.
결론
- 메서드 탐조는 람다의 간단명료한 대안이 될 수 있다.
- 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때만 람다를 사용하자.
'Java > Effective Java' 카테고리의 다른 글
[Effective Java] Item 45. 스트림은 주의해서 사용하라 (0) | 2023.07.08 |
---|---|
[Effective Java] Item 44. 표준 함수형 인터페이스를 사용하라 (0) | 2023.07.08 |
[Effective Java] Item 42. 익명 클래스보다는 람다를 사용하라 (0) | 2023.07.02 |
[Effective Java] Item 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 (0) | 2023.06.30 |
[Effective Java] Item 40. @Override 애너테이션을 일관되게 사용하라 (0) | 2023.06.30 |