반응형
람다식은 코드 블록을 간결하게 전달하는 기능이지만,
이미 존재하는 메서드를 대신 호출만 할 경우, :: 문법을 활용한 메서드 참조(Method Reference) 를 사용할 수 있습니다.
이번 예제에서는 정적 메서드와 인스턴스 메서드를 참조하여
람다식 대신 사용하는 방법을 알아보겠습니다.
📦 Calcuable.java
package ch16.sec05;
public interface Calcuable {
double calc(double x, double y);
}
📦 Person.java
package ch16.sec05;
public class Person {
public void action(Calcuable calcuable) {
double result = calcuable.calc(10, 4);
System.out.println("결과 : " + result);
}
}
📦 Computer.java
package ch16.sec05;
public class Computer {
public static double staticMethod(double x, double y) {
return x + y;
}
public double instanceMethod(double x, double y) {
return x * y;
}
}
📌 예제 코드
package ch16.sec05;
public class MethodReferenceExample {
public static void main(String[] args) {
Person person = new Person();
// 정적 메서드 참조
// person.action((x, y) -> Computer.staticMethod(x, y));
person.action(Computer::staticMethod);
// 인스턴스 생성 후 참조 방식 1
// person.action((x, y) -> new Computer().instanceMethod(x, y));
person.action(new Computer()::instanceMethod);
// 인스턴스 생성 후 참조 방식 2 (변수 활용)
Computer com = new Computer();
person.action(com::instanceMethod);
// person.action((x, y) -> com.instanceMethod(x, y));
}
}
💻 실행 결과
결과 : 14.0
결과 : 40.0
결과 : 40.0
💬 코드 설명
- Computer::staticMethod는 static double calc(double x, double y) 형태의
정적 메서드 참조로, 해당 메서드가 Calcuable의 추상 메서드와 시그니처가 일치하므로 전달 가능합니다. - new Computer()::instanceMethod 또는 com::instanceMethod는
Computer 클래스의 인스턴스 메서드 참조 방식입니다. - Person 클래스의 action() 메서드는 Calcuable 타입을 매개로 받기 때문에,
이 메서드 참조는 모두 람다식 없이도 적합한 메서드로 자동 매핑됩니다.
💡 포인트 정리
- 메서드 참조는 람다식 → 메서드 호출 패턴을 간결하게 표현할 수 있는 문법입니다.
- 정적 메서드 참조: 클래스명::메서드명
- 인스턴스 메서드 참조: 인스턴스명::메서드명
- 참조되는 메서드는 함수형 인터페이스의 추상 메서드 시그니처와 동일해야 합니다.
- 코드가 더욱 간결하고 직관적으로 작성되며, 재사용성과 유지보수성도 높아집니다.
📌정리하자면, 이번 예제에서는 람다식 대신 메서드 참조를 활용하여
기존에 정의된 메서드를 직접 넘기는 방식으로 action() 메서드를 실행해 보았습니다.
이 방법은 불필요한 람다식을 제거하고, 코드의 명확성을 높이는 데 유용합니다.
정적/인스턴스 메서드 모두 메서드 참조 형태로 활용할 수 있으니 상황에 따라 적절히 사용해보세요.
❓ 람다식을 사용하지 않을 경우
package ch16.sec05;
public class MethodReferenceExample {
public static void main(String[] args) {
Person person = new Person();
// 정적 메서드 참조 대신 익명 구현 객체 사용
person.action(new Calcuable() {
@Override
public double calc(double x, double y) {
return Computer.staticMethod(x, y);
}
});
// 인스턴스 메서드 참조 대신 익명 구현 객체 사용 (Computer 생성 직접)
person.action(new Calcuable() {
@Override
public double calc(double x, double y) {
Computer com = new Computer();
return com.instanceMethod(x, y);
}
});
// 이미 생성된 인스턴스를 활용한 참조도 익명 구현 객체로 표현
Computer com = new Computer();
person.action(new Calcuable() {
@Override
public double calc(double x, double y) {
return com.instanceMethod(x, y);
}
});
}
}
🔍 차이점 요약
방식 | 간결성 | 가독성 | 용도 |
람다식 / 메서드 참조 | 매우 간결 | 직관적 | 함수형 인터페이스 사용 시 이상적 |
익명 구현 객체 | 장황함 | 구조 파악 명확 | 람다를 사용할 수 없는 예외적인 상황에서 사용 |
'Java > 자바 정리' 카테고리의 다른 글
161. Stream API 시작하기 – 컬렉션 요소 반복 처리 (0) | 2025.05.23 |
---|---|
160. 생성자 참조(Constructor Reference) – new 키워드도 메서드 참조처럼 사용하기 (0) | 2025.05.22 |
159. 메서드 참조 – 문자열 비교에 활용하기 (0) | 2025.05.22 |
157. 람다식에서 리턴값 처리하기 – 반환형 함수형 인터페이스 (0) | 2025.05.22 |
156. 람다식으로 매개변수 전달받기 – 다양한 함수형 인터페이스 실습 (0) | 2025.05.22 |
155. 람다식으로 이벤트 처리하기 – 버튼 클릭 리스너 구현 (1) | 2025.05.22 |