[Effective Java 3/E] ITEM 43. 람다보다는 메서드 참조를 사용하라

    Effective Java 표지. Source : https://blog.insightbook.co.kr/

    *알림 : *
    Effective Java 3판은 Java 9까지 도입된 언어적 기능을 중심으로 서술되어 있습니다. 10버젼 이후의 Java 개발을 하시는 분들은 우회적인 접근법 대신 Java 언어 내 새로 도입된 기능이 더 간결하고 좋을 수 있습니다.

    해당 포스팅은 SSAFY 내 책읽기 스터디의 활동을 통해 작성된 포스팅입니다.
    https://github.com/kjsu0209/JavaBook
    https://medium.com/javabook

     

    JavaBook – Medium

    Documentation space of our book study.

    medium.com

     

    kjsu0209/JavaBook

    책읽기 스터디. Contribute to kjsu0209/JavaBook development by creating an account on GitHub.

    github.com

    람다는 익명 클래스보다 간결하다. 람다보다 더 간결한 방법은 메서드 참조(method reference)를 이용하는 것이다.

    value가 key의 인스턴스 갯수인 multimap(중복이 허용되는 map)을 관리하는 코드의 일부를 보자. key에 해당하는 value가 없다면 1을, 아니라면 기존 매핑값을 증가시킨다.

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

    단순히 합을 리턴하는 람다식이다. 각 변수의 이름은 크게 중요하지 않은데도 의미를 표현하느라 코드 공간을 꽤 많이 차지한다. Integer wrapper class는 위의 람다와 똑같은 sum 메서드를 제공한다. 아래와 같이 대체할 수 있다.

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

    그러나 마냥 메서드 참조가 정답이 아닌 이유

    1. 그러나 람다의 매개변수 자체가 코드 이해에 도움이 되는 경우도 있다.
    2. 메서드 참조는 코드를 간결하게 해주지만 코드의 의미까지 간결하게 하는 부작용도 있다.
    3. 메서드 참조가 더 길 때도 있다.
    //메서드 참조
    service.execute(GoshThisClassNameIsHumongouse::action);
    
    //람다식
    service.execute(()->action());

    간결함도 의미도 잡지 못한 메서드 참조 방식이 될 수도 있다.

    그래서 어쩌라고?

    람다와 메서드 참조 중 더 간결한 것을 찾고, 만약 메서드 참조 코드가 코드 자체로 의미를 띄지 못할거면 코드가 좀 길어지더라도 람다의 매개변수 이름 등으로 의미를 명확하게 하는 것을 고려해보자.

    메서드 참조 유형

    Untitled

     

    Reference

    한정적/비한정적 메서드 참조 유형의 차이가 무엇인지 궁금했는데, 너무 명확한 설명을 한 stackoverflow 문서가 있었다.

    https://stackoverflow.com/questions/35914775/java-8-difference-between-method-reference-bound-receiver-and-unbound-receiver

    댓글