Skip to content

Item 43. 람다보다는 메서드 참조를 사용하라 #43

@hyunsoo10

Description

@hyunsoo10

Chapter : 7. 람다와 스트림

Item : 43. 람다보다는 메서드 참조를 사용하라

Assignee : hyunsoo10


🍑 서론

람다가 익명 클래스보다 나은 점 중에서 가장 큰 특징은 간결함이다. 하지만 이보다 더 간결하게 만들 수 있는 방법이 바로 메서드 참조다.

🍑 본론

🔸람다

map.merge(key, 1, (count, incr) -> count + incr);
  • 자바 8 때 추가된 Map의 merge 메서드이다. merge 메서드는 키, 값, 함수를 인수로 받으며 주어진 키가 맵 안에 아직 없다면 {키, 값} 쌍을 그대로 저장한다. 반대로, 키가 있다면 맵에 {키, 함수의 결과} 쌍을 저장한다.

깔끔해 보이지만, 매개변수 count, incr는 크게 하는 일 없이 공간을 차지한다. 자바 8이 되면서 Integer 클래스는 정적 메서드 sum을 제공한다.

🔹메서드 참조

//Integer 클래스의 sum 메서드
public static int sum(int a, int b) {
    return a + b;
}

//정적 메서드 참조 
map.merge(key, 1, Integer::sum);

람다로 할 수 없는 일이라면 메서드 참조로도 할 수 없다.

메서드 참조를 사용하는 편이 보통은 더 짧고 간결하므로, 람다로 구현했을 때 너무 길거나 복잡하면 메서드 참조가 좋은 대안이되어준다.


IDE들은 람다를 메서드 참조로 대체하라고 권할 것이고, 보통 그 권고를 따르는 게 이득이지만, 항상 그런 것은 아니다.

때론 람다가 메서드 참조보다 간결할 때가 있다. 주로 메서드와 람다가 같은 클래스 안에 있을 때 그렇다.


예를들어 다음 코드가 GoshThisClassNameIsHumonous 클래스 안에 있다고 해보자.

🔹메서드 참조

service.execute(GoshThisClassNameIsHumonous::action);

이를 람다로 대체하면 다음처럼 된다.

🔸람다

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

메서드 참조 쪽이 더 짧지도, 명확하지도 않기 때문에 람다 쪽이 더 낫다.

인스턴스 메서드를 참조하는 유형은 다섯 가지다. 본론에서 살펴 본 것이 정적 메서드 참조다.

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

✏️한정적 인스턴스 메서드 참조

  • 수신 객체(참조 대상 인스턴스)를 특정함
  • 근본적으로 정적 메서드 참조와 비슷
  • 즉, 함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 똑같다
//한정적 메서드 참조
Instant.now()::isAfter
//같은 기능의 람다
Instance then = Instant.now();
t->then.isAfter(t);

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

  • 수신 객체(참조 대상 인스턴스)를 특정하지 않음
  • 주로 스트림 파이프라인에서 매핑과 필터 함수에 쓰임(아이템 45)
//비한정적 메서드 참조
String::toLowerCase
//같은 기능의 람다
str -> str.toLowerCase();

✏️클래스 생성자 메서드 참조

//클래스 생성자 메서드 참조
TreeMap<K, V>::new
//같은 기능의 람다
() -> new TreeMap<K,V>()

✏️배열 생성자 메서드 참조

//배열 생성자 메서드 참조
int[]::new
//같은 기능의 람다
len -> new int[len]

🍑 결론

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


Referenced by

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions