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

문법식·2022년 9월 6일
0

Effective Java 3/E

목록 보기
43/52

람다가 익명 클래스보다 나은 점 중에서 가장 큰 특징은 간결함이다. 그런데 자바에는 함수 객체를 람다보다도 더 간결하게 만드는 방법이 있다. 그것은 바로 메서드 참조(method reference)다. 다음 코드는 임의의 키와 Integer 값의 매핑을 관리하는 프로그램의 일부다.

map.merge(key, 1, (count, incr) -> count + incr);

위의 람다는 인수의 함을 단순히 반환할 뿐이다. 자바 8이 되면서 Integer 클래스(와 모든 기본 타입의 박싱 타입)은 이 람다와 기능이 같은 정적 메서드 sum을 제공한다. 따라서 람다 대신 이 메서드의 참조를 전달하면 더 간결한 코드를 얻을 수 있다.

map.merge(key, 1, Integer::sum);

람다로 할 수 없는 일이라면 메서드 참조로도 할 수 없다. 메서드 참조를 사용하는 편이 보통은 더 짧고 간결하므로, 람다로 구현했을 때 너무 길거나 복잡하다면 메서드 참조를 사용하는 것이 좋다. 메서드 참조에는 기능을 잘 드러내는 이름을 지어줄 수 있고 친절한 설명을 문서로 남길 수 있다.

람다를 메서드 참조로 바꾸는게 보통은 이득이지만 그렇지 않을 때도 있다. 다음 코드가 GoshThisClassNameInHumongous 클래스 안에 있다고 해본다.

service.execute(GoshThisClassNameIsHumongous::action);

이를 람다로 대체하면 다음과 같다.

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

메서드 참조 쪽은 더 짧지도, 더 명확하지도 않다. 따라서 람다 쪽이 낫다. 핵심은 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때만 람다를 사용하면 된다.

메서드 참조의 유형은 다섯 가지다. 가장 흔한 유형은 앞에서 살펴본 것처럼 정적 메서드를 가리키는 메서드 참조다. 나머지 네 가지 유형을 살펴본다.

  • 인스턴스 메서드 참조
    • 한정적 인스턴스 메서드 참조

      Intstant.now()::isAfter

      수신 객체(참조 대상 인스턴스)를 특정한다.(위 코드에선 now()) 근본적으로 정적 참조와 비슷하다. 함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 똑같다.

    • 비한정적 인스턴스 메서드 참조

      String::toLowerCase

      수신 객체를 특정하지 않는다.(어떤 String 객체를 소문자화 할 것인지 적혀있지 않음.) 함수 객체를 적용하는 시점에서 수신 객체를 알려준다. 비한정적 참조는 주로 스트림 파이프라인에서의 매핑과 필터 함수에 스인다.

  • 클래스 생성자를 가리키는 메서드 참조
    TreeMap<K, V>::new
  • 배열 생성자를 가리키는 메서드 참조
    int[]::new
profile
백엔드

0개의 댓글