맞는데 왜 틀릴까..?

Java/Effective Java

[Effective Java] Item 43. 람다보다는 메서드 참조를 사용하라

안도일 2023. 7. 8. 21:19

람다보다도 더 함수 객체를 간결하게 만드는 방법이 메서드 참조(method reference)다.

 

어떤 람다에서는 매개변수의 이름 자체가 프로그래머에게 좋은 가이드가 되기도 한다.

이런 람다는 길이는 더 길지만 메서드 참조보다 읽기 쉽고 유지보수도 쉬울 수 있다.

 

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

 

 

메서드 참조의 5가지 유형

 

 

1. 정적 메서드를 가리키는 메서드 참조

 

 

 

 

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

 

 

  • Calculator의 인스턴스를 생성하고 해당 인스턴스를 사용하여 한정적 인스턴스 메서드 참조를 생성한다.
  • addFunction은 Calculator의 add 메서드를 참조하고 있으며 subtractFunction은 Calculator의 subtract 메서드를 참조하고 있다. 이렇게 한정적 인스턴스 메서드 참조를 생성하면, 수신 객체가 해당 인스턴스인 것을 명시적으로 나타낼 수 있다.

 

 

 

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

 

 

 

  • 비한정적 참조에서는 함수 객체를 적용하는 시점에 수신 객체를 알려준다.
  • 이를 위해 수신 객체 전달용 매개변수가 매개변수 목록의 첫 번째로 추가되며, 그 뒤로는 참조되는 메서드 선언에 정의된 매개변수들이 뒤따른다. 

 

 

4. 클래스 생성자를 가리키는 메서드 참조

 

 

  • MyClass::new;는 MyClass의 생성자를 가리키는 메서드 참조를 정의하고 있다.
  • constructor.apply("Example")를 호출하여 MyClass의 인스턴스를 생성하고 "Example"을 인자로 전달하여 초기화한다.

 

 

5. 배열 생성자를 가리키는 메서드 참조

 

 

  • String[]::new는 String 배열 생성자를 가리키는 메서드 참조를 정의하고 있다.
  • arrayConstructor.apply(5)를 호출하여 String 배열의 인스턴스를 생성하고, 길이를 5로 지정한다.

 

결론

 

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