woowacourse-study/2022-modern-java-in-action

메서드 참조란 무엇일까

Opened this issue · 1 comments

문제

메서드 참조란 무엇일까?

선정 배경

스트림을 쓸 때 메서드 참조에 익숙하지 않아 람다식을 적고나면 인털리제이가 추천해주는데로 메서드 참조를 하였다. 메서드 참조가 뭐길래 더 좋을까?

관련 챕터

Ch.3

기본 개념

람다식으로 메서드를 간결하게 표현할 수 있다. 하지만 람다식의 하나의 메서드만 호출하는 경우에는 메서드 참조로 람다식을 더 간략히 할 수 있다.

Function<String, Integer> f = (String s) -> Integer.parseInt(s);
// 메서드 참조
Function<String, Integer> f = Integer::parseInt;

람다식의 일부가 생략됐는데 컴파일러가 우변의 선언부, 또는 좌변의 인터페이스에서 지네릭 타입으로부터 알아낸다.

BiFunction<String, String, Boolean> f = (s1, s2) -> s1.equals(s2);
BiFunction<String, String, Boolean> f = String::equals;

클래스 이름을 반드시 붙여줘야 하는데, 다른 클래스에도 동일한 이름의 메서드가 있을 수 있기 때문이다.

메서드 참조 다섯 가지 유형

  1. 정적 메서드 참조
str -> Integer.parseInt(str);
Integer::parseInt

2, 3. 인스턴스 메서드 참조

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

Instant.now()::isAfter

참조 대상 인스턴스를 한정했다해서 한정적 인스턴스 메서드 참조라 부른다.

str -> str.toLowerCase()
String::toLowerCase

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

  1. 클래스 생성자
() -> new TreeMap<K,V>()
TreeMap<K,V>::new
  1. 배열 생성자
len -> new int[len]
int[]::new

주의 사항

만약 매개변수 이름이 드러나는게 가독성이 더 좋거나, 람다가 더 간결한 경우 람다를 쓰자.

service.execute(GoshThisClassNameIsHumongous::action); // 메서드 참조
service.execute(() -> action());

위의 경우 확실히 람다식이 훨씬 가독성이 좋다.