Java/자바 정리

158. 메서드 참조(Method Reference) – 람다식을 간결하게 대체하기

코딩하는냥이 2025. 5. 22. 12:46
반응형

람다식은 코드 블록을 간결하게 전달하는 기능이지만,
이미 존재하는 메서드를 대신 호출만 할 경우, :: 문법을 활용한 메서드 참조(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);
			}
		});
	}
}

🔍 차이점 요약

방식 간결성 가독성 용도
람다식 / 메서드 참조 매우 간결 직관적 함수형 인터페이스 사용 시 이상적
익명 구현 객체 장황함 구조 파악 명확 람다를 사용할 수 없는 예외적인 상황에서 사용