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