익명 클래스보다 더 좋은 게 있어!
람다
람다보다 더 좋은 게 있어 !
메서드 참조
🧐 메서드 참조는 뭐고
🤔 람다와 메서드 참조의 차이는 뭘까
메서드 참조(Method reference)
Java 8에 도입된 메서드 참조는 class::methodName 구문을 사용하여 클래스 또는 객체에서 메서드를 참조할 수 있다.
메서드 참조는 이중 콜론(::)을 사용하여 클래스 이름과 메서드 이름을 구분하며,
람다식과 달리 인수를 전달할 필요가 없고, 인수는 메서드 참조 타입에 따라 처리된다.
예시)
// 람다식
str -> str.toString()
// 메서드 참조
String::toString
// 람다식
str -> str.length()
// 메서드 참조
String::length
// 람다식
(int x, int y) -> x.compareTo(y)
// 메서드 참조
Integer::compareTo
Map의 merge 메서드 예시)
임의의 키와 Integer 값의 매핑을 관리하는 프로그램을 작성하는 경우
키, 값, 함수를 인수로 받으며, 주어진 키가 맵 안에 아직 없다면 주어진 {키, 값} 쌍을 그대로 저장
반대로 키가 이미 있다면 함수를 현재 값과 주어진 값에 적용한 다음, 그 결과로 현재 값을 덮어씀
즉, Map에 {키, 함수결과,} 쌍을 저장
람다와 메서드 참조 차이
class Example {
public static void main(String[] args) {
// 람다를 사용
map.merge(key, 1, (count, incr) -> count + incr);
// 메서드 레퍼런스 사용
map.merge(key, 1, Integer::sum);
}
}
매개 변수가 늘어날수록 메서드 참조로 생략할 수 있는 코드 양도 늘어난다.
"람다로 구현했을 때 너무 길거나 복잡하다면 메서드 참조가 좋은 대안이 되어준다."
"람다로 작성할 코드를 새로운 메서드에 담은 다음, 람다 대신 그 메서드 참조를 사용하는 식이다.
메서드 참조에는 기능을 잘 드러내는 이름을 지어줄 수 있고 친절한 설명을 문서로 남길 수도 있다."
메서드 참조가 람다보다 무조건 더 좋다는 게 아니라 말 그대로 대안이 될 수 있는 것이고,
상황에 맞게 람다나 메서드 참조 둘 중에 사용하면 되겠다.
람다로 할 수 없는 일이라면 메서드 참조로도 할 수 없다.
다음 예시 같은 경우는 람다를 메서드 참조가 오히려 람다보다 더 짧지도 명확하지도 않다.
이럴 경우 메서드 참조보다 그냥 람다를 사용하라는 거다.
class Example {
public static void main(String[] args) {
// 메서드 참조 사용
service.execute(GoshThisClassNameIsHumongous::action);
// 람다 사용
service.execute(() -> action());
}
}
java.util.function 패키지가 제공하는 제네릭 정적 팩토리 메서드인 Function.identity()를 사용하는 것보다
람다(x -> x)를 사용하는 것이 더 간결하고 명확하다.
메서드 참조의 유형
- 정적 메서드에 대한 메서드 참조(Class::StaticMethodName)
- Object 인스턴스 메서드에 대한 참조(Object::instanceMethodName)
- 특정 타입(또는 클래스)에 대한 인스턴스 메서드에 대한 메서드 참조(Class::instanceMethodName)
- 생성자에 대한 메서드 참조(Class::new)
https://developer-talk.tistory.com/462
[Java]메서드 참조(Method reference)
메서드 참조(Method reference)란? Java 8에 도입된 메서드 참조는 class::methodName 구문을 사용하여 클래스 또는 객체에서 메서드를 참조할 수 있습니다. 람다식(Lambda Expression)의 가장 큰 장점 중 하나는
developer-talk.tistory.com
정리
메서드 참조는 람다의 '대안'이고,
메서드 참조가 더 간결하면 그거 쓰고, 그렇지 않으면 람다 써라~
'🤓 스터디 > 이펙티브 자바' 카테고리의 다른 글
[아이템 50] 적시에 방어적 복사본을 만들라 (0) | 2023.04.17 |
---|---|
[아이템 49] 매개변수가 유효한지 검사하라 (0) | 2023.04.13 |
[아이템 25] 톱레벨 클래스는 한 파일에 하나만 담으라 (0) | 2023.04.07 |
[아이템 24] 멤버 클래스는 되도록 static으로 만들라 (0) | 2023.04.07 |
[아이템 23] 태그달린 클래스보다는 클래스 계층구조를 활용하라 (0) | 2023.04.05 |
댓글