-
아이템43. 람다보다는 메서드 참조를 사용하라JAVA/Effective java 2021. 5. 8. 22:54
- 람다가 익명 클래스보다 나은 점 중에서 가장 큰 특징은 간결함이다.
- 그런데 자바에는 함수 객체를 람다보다도 더 간결하게 만드는 방법이 있으니, 바로 메서드 참조이다.
- 다음 코드는 임의의 키와 Integer 값의 매핑을 관리하는 프로그램의 일부다.
- 깔끔해 보이는 코드지만 거추장스러운 부분이 남아 있다.
- 매개변수인 count와 incr는 크게 하는 일 없이 공간을 차지한다.
- 이 람다는 두 인수의 합을 단순히 반환할 뿐이다.
- 자바 8이 되며 Integer 클래스는 이 람다와 기능이 같은 정적 메서드 sum을 제공하기 시작했다.
- 따라서 람다 대신 이 메서드의 참조를 전달하면 똑같은 결과를 더 보기 좋게 얻을 수 있다.
- 람다로 할 수 없는 일이라면 메서드 참조로도 할 수 없다.
- 람다로 작성할 코드를 새로운 메서드에 담은 다음, 람다 대신 그 메서드 참조를 사용하는 식인데 메서드 참조에는 기능을 잘 드러내는 이름을 지어줄 수 있고 친절한 설명을 문서로 남길 수도 있다.
- 메서드 참조의 유형은 다섯 가지로, 가장 흔한 유형은 앞의 예에서 본 것처럼 정적 메서드를 가리키는 메서드 참조다.
- 나머지 유형 네 가지를 살펴보자.
- 먼저 인스턴스 메서드를 참조하는 유형이 두 가지 있다.
- 그중 하나는 수신 객체를 특정하는 한정적 인스턴스 메서드 참조이고,
- 다른 하나는 수신 객체를 특정하지 않는 비한정적 인스턴스 메서드 참조이다.
- 한정적 참조는 근본적으로 정적 참조와 비슷한데 함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 똑같다.
- 즉 함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 똑같다.
- 비한정적 참조에서는 함수 객체를 적용하는 시점에 수신 객체를 알려준다.
- 이를 위해 수신 객체 전달용 매개변수가 매개변수 목록의 첫 번째로 추가되며, 그 뒤로는 참조되는 메서드 선언에 정의된 매개변수들이 뒤따른다.
- 마지막으로 클래스 생성자를 가리키는 메서드 참조와 배열 생성자를 가리키는 메서드 참조가 있다.
핵심 정리
- 메서드 참조는 람다의 간단명료한 대안이 될 수 있다.
- 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때만 람다를 사용하라.
참고 자료
'JAVA > Effective java' 카테고리의 다른 글
아이템44. 표준 함수형 인터페이스를 사용하라 (0) 2021.05.09 아이템42. 익명 클래스보다는 람다를 사용하라 (0) 2021.05.05 아이템41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라. (0) 2021.05.04 아이템 40. @Override 애너테이션을 일관되게 사용하라 (0) 2021.04.18 아이템39. 명명 패턴보다 에너테이션을 사용하라 (0) 2021.04.16