Effective Java 7강 ITEM43 람다보다는 메서드 참조를 사용하라

park geonwoo·2024년 10월 29일

Effective Java

목록 보기
44/56

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

두줄 정리

메서드 참조는 람다의 간단명료한 대안이 될 수 있다.

메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때만 람다를 사용하라.


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

람다가 익명 클래스보다 나은 점 중에서 가장 큰 특징은 간결함 입니다.

그런데 자바에는 함수 객체를 심지어 람다보다도 더 간결하게 만드는 방법이 있는데

그 방법이 ‘메서드 참조’ 입니다.



메서드 참조란?

함수 객체를 람다보다 더 간결하게 만드는 방법입니다.

메서드 참조를 사용하는 편이 보통 더 짧고 간결하므로,

람다로 구현했을 때 너무 길거나 복잡하다면 메서드 참조가 더 좋은 대안이라는 것입니다.


인텔리를 보면 람다를 메서드 참조로 대체하라고 많이 권하고 있습니다.

물론 대체 함으로써 이득일 때가 많겠지만, 때로는 람다가 더 간결할 수 있다는 것입니다.


어떤 경우?

주로 메서드와 람다가 같은 클래스에 있을때 그렇습니다.

예를들어 아래의 함수들이 BaseballIdenticalNumberCount 클래스안에 있다고 했을 때,

메소드의 참조가 더 짧지도 명확하지도 않으므로 람다가 낫다는 것입니다.

class BaseballIdenticalNumberCount { 
    // 메서드 참조
    service.execute(BaseballIdenticalNumberCount::action);

    // 람다
    service.execute(() -> action());
}



메소드 참조를 이용하라.

키와 값 함수를 인수로 받으면서 {키, 값} 쌍을 저장합니다.

하지만, 이런 코드도 마음에 들어하지 않는다는 것입니다.

//java 8 map안에 추가된 merge
map.merge(key, 1, (count, incr) -> count + incr);

이유는?

count와 incr이 하는일이 없이 공간을 차지하고 있기 때문입니다.

그리하여 Java 8부터는 Integer 클래스는 람다와 기능이 같은 정적 메서드

sum을 제공하기 시작했습니다.

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

따라서 람다 대신에 이 메서드의 참조를 전달하면 똑같은 결과를 받을 수 있게 되는 것입니다.

람다가 무조건 좋은 가이드인것은 아니다.


매개변수의 이름 자체가 프로그래머의 좋은 가이드가 되기도 할때에는

메소드 참조보다 가독성도 좋고 유지보수도 쉬울 수 있다.

즉 람다로도 못한다면 메소드참조로도 할 수 없다.



메서드 참조 다섯 가지 유형

1. 정적 메서드 참조

Integer::parseInt

str -> Integer.parseInt(str);

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

수신 객체(참조 대상 인스턴스)를 특정하는 한정적 인스턴스 메서드 참조.

근본적으로 정적 참조와 비슷하다.

즉 함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 똑같다.

Instant.now()::isAfter

Instant then = Instant.now();
t -> then.isAfter(t);

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

수신 객체를 특정하지 않는 인스턴스 메서드 참조.

함수 객체를 적용하는 시점에 수신 객체를 알려준다.

주로 스트림 파이프라인에서의 매핑과 필터 함수에 쓰인다.

String::toLowerCase

str -> str.toLowerCase()

4. 클래스 생성자

TreeMap<K,V>::new

() -> new TreeMap<K,V>()

5. 배열 생성자

int[]::new

len -> new int[len]

참고
https://github.com/SeolYoungKim/effective_java_study

0개의 댓글