Adventure Time - Lady Rainicorn [아이템 43] 람다보다는 메서드 참조를 사용하라
본문 바로가기
🤓 스터디/이펙티브 자바

[아이템 43] 람다보다는 메서드 참조를 사용하라

by 강켄트 2023. 4. 7.

 

익명 클래스보다 더 좋은 게 있어!  

람다

 

람다보다 더 좋은 게 있어 !

메서드 참조 

 

🧐 메서드 참조는 뭐고

🤔 람다와 메서드 참조의 차이는 뭘까

 

메서드 참조(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

 

정리

메서드 참조는 람다의 '대안'이고,

메서드 참조가 더 간결하면 그거 쓰고, 그렇지 않으면 람다 써라~

댓글