카테고리:

업데이트:

1. 들어가기

Item 42에서 알아보았던 람다의 큰 장점은 간결함이었습니다.

하지만, 이보다 더 간결하게 사용할 수 있는 메서드 참조에 대해 한번 알아보겠습니다.

2. 메서드 참조(Method Reference)

메서드 참조는 람다 표현식이 단 하나의 메소드만을 호출하는 경우

해당 람다에서 불필요한 매개변수를 제거하고 사용할 수 있도록 해줍니다.

보통, 람다는 다음과 같이 사용합니다.

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

이를 메서드 참조로 대체하면 다음과 같이 사용할 수 있습니다.

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

메서드 참조의 위력은 람다에서 표현해야 할 매개변수의 수가 늘어날수록 발휘됩니다.

만약, 람다에서 사용할 매개변수의 수가 여러 개라면

메서드 참조에서는 매개변수를 사용하지 않아도 되니 제거할 수 있는 코드양도 늘어나게 됩니다.

3. 메서드 참조 유형

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

  1. 정적 메서드 참조 유형

    정적 메서드를 가리키는 메서드 참조 유형입니다.

    Integer::parseInt


  2. 한정적 인스턴스 메서드 참조 유형

    인스턴스 메서드 중 수신 객체를 특정하는 메서드 참조 유형입니다.

    Instant.now()::isAfter


  3. 비한정적 인스턴스 메서드 참조 유형

    인스턴스 메서드 중 수신 객체를 특정하지 않는 메서드 참조 유형입니다.

    String::toLowerCase


  4. 클래스 생성자 참조 유형

    TreeMap<K,V>::new


  5. 배열 생성자 참조 유형

    int[]::new

4. 메서드 참조가 항상 좋을까?

앞서 메서드 참조는 람다보다 간결하다는 장점이 있었습니다.

그러나 때론, 람다가 메서드 참조보다 간결할 때가 있습니다.

예를 들어 action 메서드가 GoshThisClassNameIsHumongous 클래스 안에 있다고 가정하면

메서드 참조로 표현하면 다음과 같습니다.

  service.execute(GoshThisClassNameIsHumongous::action);

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

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

즉, 메서드 참조는 람다와 비교했을 때 모든 경우에 간결하거나 명확한 것은 아닙니다.

5. 정리

이번 포스트는 메서드 참조에 대해 알아보았습니다.

메서드 참조는 총 5가지의 유형이 있고 람다보다 더 간결하고 명확하다는 장점이 있었습니다.

하지만, 메서드 참조는 모든 경우에 람다보다 간결하거나 명확하지 않기 때문에

메서드 참조가 짧고 명확하다면 메서드 참조를 사용하고, 그렇지 않는 경우에만 람다를 사용합시다.

            
              📕 개인 기록용 블로그입니다.
              😊 오타나 잘못된 정보가 있을 경우 댓글이나 메일로 말씀해주시면 바로 수정하겠습니다! 😊
          

댓글남기기