JAVA/Effective java

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

100win10 2021. 5. 8. 22:54
  • 람다가 익명 클래스보다 나은 점 중에서 가장 큰 특징은 간결함이다.
  • 그런데 자바에는 함수 객체를 람다보다도 더 간결하게 만드는 방법이 있으니, 바로 메서드 참조이다.
  • 다음 코드는 임의의 키와 Integer 값의 매핑을 관리하는 프로그램의 일부다.

 

  • 깔끔해 보이는 코드지만 거추장스러운 부분이 남아 있다.
  • 매개변수인 count와 incr는 크게 하는 일 없이 공간을 차지한다.
  • 이 람다는 두 인수의 합을 단순히 반환할 뿐이다.

 

 

  • 자바 8이 되며 Integer 클래스는 이 람다와 기능이 같은 정적 메서드 sum을 제공하기 시작했다.
  • 따라서 람다 대신 이 메서드의 참조를 전달하면 똑같은 결과를 더 보기 좋게 얻을 수 있다.

 

  • 람다로 할 수 없는 일이라면 메서드 참조로도 할 수 없다.
  • 람다로 작성할 코드를 새로운 메서드에 담은 다음, 람다 대신 그 메서드 참조를 사용하는 식인데 메서드 참조에는 기능을 잘 드러내는 이름을 지어줄 수 있고 친절한 설명을 문서로 남길 수도 있다.

 

 

 

  • 메서드 참조의 유형은 다섯 가지로, 가장 흔한 유형은 앞의 예에서 본 것처럼 정적 메서드를 가리키는 메서드 참조다.

  • 나머지 유형 네 가지를 살펴보자.

 

 

  • 먼저 인스턴스 메서드를 참조하는 유형이 두 가지 있다.
  • 그중 하나는 수신 객체를 특정하는 한정적 인스턴스 메서드 참조이고,
  • 다른 하나는 수신 객체를 특정하지 않는 비한정적 인스턴스 메서드 참조이다.

 

 

  • 한정적 참조는 근본적으로 정적 참조와 비슷한데 함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 똑같다.
  • 즉 함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 똑같다.

 

 

  • 비한정적 참조에서는 함수 객체를 적용하는 시점에 수신 객체를 알려준다.
  • 이를 위해 수신 객체 전달용 매개변수가 매개변수 목록의 첫 번째로 추가되며, 그 뒤로는 참조되는 메서드 선언에 정의된 매개변수들이 뒤따른다.

 

 

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

 

 

핵심 정리


  • 메서드 참조는 람다의 간단명료한 대안이 될 수 있다.
  • 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때만 람다를 사용하라.

 

 

참고 자료 

 


이펙티브 자바