IT/Java
[Java] 메소드 참조(method reference)
Huitopia
2024. 3. 15. 00:09
728x90
메소드 참조(Method Reference)
람다 표현식이 단 하나의 메소드만 호출하는 경우 메소드를 참조하여 매개변수의 정보 및 리턴 타입을 알아내 람다식에서 불필요한 매개변수를 제거하고 사용하게 한다.
(x, y) -> Class.method(x, y);
Class :: method;
메소드 참조를 사용하면 불필요한 매개변수를 제거하고 '::' 기호를 사용하여 표현한다.
1. 정적 메소드 참조
클래스 :: 메소드
package ch16.sec00;
public class StaticMethodReferenceExample {
public static void main(String[] args) {
SMRInterface smrInterface = StaticMethodReferenceExample::staticMethod;
}
static void staticMethod(String a, int b) {
System.out.println(a + b);
}
}
@FunctionalInterface
interface SMRInterface {
void method(String a, int b);
}
2. 인스턴스 메소드 참조
참조변수 :: 메소드
package ch16.sec00;
public class InstanceMethodReferenceExample {
public static void main(String[] args) {
IMROtherClass imrOtherClass = new IMROtherClass();
// 변경 전
IMRInterface imrInterface01 = (x, y) -> {
imrOtherClass.method01(x, y);
};
// 변경 후
IMRInterface imrInterface02 = imrOtherClass::method01;
}
}
class IMROtherClass {
void method01(int a, int b) {
System.out.println(a + b);
}
}
@FunctionalInterface
interface IMRInterface {
void method(int a, int b);
}
3. 매개변수의 메소드 참조
(a, b) -> { a.instanceMethod(b)};
클래스 :: instanceMethod
작성 방법은 정적 메소드 참조와 동일하지만, a의 인스턴스 메소드가 사용된다는 부분이 다르다.
package ch16.sec00;
public class AnonymousInstanceMethodReferenceExample {
public static void main(String[] args) {
AIMROtherClass aimrOtherClass = new AIMROtherClass();
AIMRInterface aimrInterface = aimrOtherClass::method001;
}
}
class AIMROtherClass {
void method001(int x) {
System.out.println("아 모르겠다.");
}
void method001(AIMROtherClass aimrOtherClass, int x) {
}
}
@FunctionalInterface
interface AIMRInterface {
void method(AIMROtherClass obj, int x);
}
4. 생성자 참조
생성자를 호출하는 람다 표현식도 메소드 참조를 이용이 가능하다.
람다식을 단순히 객체를 생성하고 리턴하도록 구성하면 람다식을 생성자 참조로 대치할 수 있다.
(a, b) -> { return new 클래스(a, b); }
클래스 :: new
클래스 이름 뒤에 :: 기호를 붙이고 new 연산자를 기술하면 된다.
728x90