Skip to content

Latest commit

 

History

History
59 lines (35 loc) · 2.92 KB

43. 람다보다는 메서드 참조를 사용하라.md

File metadata and controls

59 lines (35 loc) · 2.92 KB

43. 람다보다는 메서드 참조를 사용하라.

자바에서 메서드 참조를 사용하면 코드를 람다보다 더 간결하게 만들 수가 있습니다.

Map<String,Integer> map = new HashMap<>();
map.merge("key", 1 ,(count, incr) -> count + incr);

이 코드는 맵에 "key"라는 키가 있으면 값을 +1을 해주고 없으면 1을 매핑하는 코드입니다.

위의 코드는 깔끔해보이기는 하지만, 매개변수 count와 incr을 거의 하는 일이 없는데 공간을 차지하는 것이 불편합니다.

사실 위의 람다는 두 인수를 더하여 단순히 값을 반환만 하는데요.

자바 8부터는 Integer 클래스에서 정적 메서드 sum을 제공하기 때문에 밑의 코드처럼 메서드의 참조를 전달하면 똑같은 결과를 얻을 수 있습니다.

Map<String,Integer> map = new HashMap<>();
map.merge("key", 1 , Integer::sum);

이제까지의 설명을 보면 메서드 참조가 람다보다 무조건 좋다고 생각하실 수도 있는데요.

하지만 어떤 람다에서는 매개변수의 이름 자체가 프로그래머에게 좋은 가이드가 될 수도 있습니다. 또한 람다의 길이는 더 길지만, 메서드 참조보다 읽기 쉽고 유지보수도 쉬울 수도 있습니다.

예를들어, 밑의 코드가 GoshThisClassNameIsHumongous 클래스 안에 있다고 가정해봅시다.

service.execute(GoshThisClassNameIsHumongous::action);

해당 코드를 람다로 변환해볼까요?

service.execute(()-> action());

여기서 알 수 있듯이 꼭 메서드 참조가 더 명확하고 짧은 것은 아닙니다.

따라서 맹목적인 메서드 참조는 지양하는 것이 좋을 것같습니다.


메서드 참조 유형에는 총 5가지가 있습니다.

한정적 참조는 참조하는 대상 인스턴스를 특정하는데요. 이는 위에서 살펴 본, 정적 참조와 비슷합니다. 즉, 함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 똑같습니다.

반면에 비한정적 참조는 참조하는 대상 인스턴스를 특정하지 않고, 함수 객체를 적용하는 시점에 수신 객체를 알려줍니다. 이를 위해 수신 객체 전달용 매개변수가 매개변수 목록의 첫 번째로 추가되며, 그 뒤로는 참조되는 메서드 선언에 정의된 매개변수들이 들어오게 됩니다. 비한정적 참조는 주로 스트림 파이프라인에서의 매핑과 필터 함수에 쓰입니다.

마지막으로, 클래스 생성자를 가리키는 메서드 참조와, 배열 생성자를 가리키는 메서드 참조가 있습니다.

스크린샷 2022-03-14 오후 7 23 43


Reference

조슈아 블로크, 이펙티브 자바 Effective Java 3/E, 2018