메소드 참조(method reference)
메소드 참조(method reference)는 람다 표현식이 단 하나의 메소드만을 호출하는 경우에 해당 람다 표현식에서 불필요한 매개변수를 제거하고 사용할 수 있도록 해줍니다.
메소드 참조를 사용하면 불필요한 매개변수를 제거하고 다음과 같이 '::' 기호를 사용하여 표현할 수 있습니다.
문법
클래스이름::메소드이름
또는
참조변수이름::메소드이름
다음 예제는 두 개의 값을 전달받아 제곱 연산을 수행하는 Math 클래스의 클래스 메소드인 pow() 메소드를 호출하는 람다 표현식입니다.
(base, exponent) -> Math.pow(base, exponent);
위의 예제는 단순히 Math 클래스의 pow() 메소드로 인수를 전달하는 역할만 하므로, 메소드 참조를 사용하여 다음과 같이 간단히 표현할 수 있습니다.
Math::pow;
또한, 특정 인스턴스의 메소드를 참조할 때에도 참조 변수의 이름을 통해 메소드 참조를 사용할 수 있습니다.
MyClass obj = new MyClass;
Function<String, Boolean> func = (a) -> obj.equals(a); // 람다 표현식
Function<String, Boolean> func = obj::equals(a); // 메소드 참조
메서드 참조 유형
- 정적 메서드에 대한 메서드 참조(Class::StaticMethodName)
- Object 인스턴스 메서드에 대한 참조(Object::instanceMethodName)
- 특정 타입(또는 클래스)에 대한 인스턴스 메서드에 대한 메서드 참조(Class::instanceMethodName)
- 생성자에 대한 메서드 참조(Class::new)
생성자 참조
생성자를 호출하는 람다 표현식도 앞서 살펴본 메소드 참조를 이용할 수 있습니다.
즉, 단순히 객체를 생성하고 반환하는 람다 표현식은 생성자 참조로 변환할 수 있습니다.
다음 예제는 단순히 객체를 생성하고 반환하는 람다 표현식입니다.
(a) -> { return new Object(a); }
위의 예제는 단순히 Object 클래스의 인스턴스를 생성하고 반환하기만 하므로, 생성자 참조를 사용하여 다음과 같이 간단히 표현할 수 있습니다.
Object::new;
이때 해당 생성자가 존재하지 않으면 컴파일 시 오류가 발생합니다.
또한, 배열을 생성할 때에도 다음과 같이 생성자 참조를 사용할 수 있습니다.
Function<Integer, double[]> func1 = a -> new double[a]; // 람다 표현식
Function<Integer, double[]> func2 = double[]::new; // 생성자 참조
연관된 글:
참고 :
JAVA - 클래스의 메소드 참조, "::", List 출력, "System.out::println"
'개발 > Java' 카테고리의 다른 글
[Java] Interface (0) | 2023.04.01 |
---|---|
[Java] 멀티 스레드(multi thread) (0) | 2023.03.29 |
[JAVA] Lambda (0) | 2023.03.20 |
[Java] 삼항 연산자 (0) | 2023.03.19 |
[Java] 접근 제어자 (Access Modifier)와 캡슐화(encapsulation) (0) | 2023.03.16 |