[Java8] 메소드 레퍼런스

[Java8] 메소드 레퍼런스

 

 

메소드 레퍼런스

특정 메소드를 간결하게 참조할 수 있는 문법입니다.

람다 표현식과 함께 사용되며, 메소드의 이름만으로 해당 메소드를 직접 참조할 수 있게 해줍니다.

 

 

Greeting class 

public class Greeting {
    private String name;

    public Greeting() {
    }

    public Greeting(String name){
        this.name = name;
    }

    public String getName() { return name; }

    public String hello(String name) {
        return "hello " + name;
    }

    public static String hi(String name) {
        return "h1 " + name;
    }
}

 

 

 

 

static 메소드 참조 [타입::스태틱 메소드]

UnaryOperator<String> hi = (s) -> "hi " + s;

람다 형식으로 작성하면 위와 같은 코드입니다.

UnaryOperator<String> hi = Greeting::hi;
hi.apply("joy");

이것을 메소드 레퍼런스 형태로 작성하면 위와 같이 줄여서 사용할 수 있습니다.

Greeting::hi는 Greeting 클래스의 hi static 메소드를 참조한 것입니다.

 


 

 

특정 객체의 인스턴스 메소드 참조 [객체 레퍼런스::인스턴스 메소드]

Greeting greeting = new Greeting();
UnaryOperator<String> hello = greeting::hello;
System.out.println(hello.apply("joy"));

Greeting 클래스의 인스턴스 메소드(hello)를 참조하는 코드입니다.

인스턴스 메소드를 참조하기 때문에 Greeting의 선언이 필요합니다.

 


 

 

임의 객체의 인스턴스 메소드 참조 [타입::인스턴스 메소드]

String[] names = {"joy", "bongbong", "happy"};
Arrays.sort(names, (o1,o2) -> 0);              //람다

람다 형식으로 작성하면 위와 같은 코드입니다.

String[] names = {"joy", "bongbong", "happy"};
Arrays.sort(names, String::compareToIgnoreCase); //메소드 레퍼런스
System.out.println(Arrays.toString(names));

이것을 메소드 레퍼런스 형태로 작성하면 위와 같이 줄여서 사용할 수 있습니다.

타입::인스턴스 메소드 형태로 작성합니다.

 


 

 

생성자 참조  [타입::new] 

Supplier<Greeting> newGreeting = Greeting::new;
newGreeting.get();

받는 변수가 없는 생성자 참조의 메소드 레퍼런스입니다.

받는 인자값이 없는 Supplier를 사용하여 생성자 메소드를 참조할 수 있습니다.

public Greeting() 생성자 참조

 

 

생성자 참조  [타입::new] 

Function<String, Greeting> joyGreeting = Greeting::new;
Greeting joy = joyGreeting.apply("joy");
System.out.println(joy.getName());

받는 인자값이 있는 생성자 참조 메소드 레퍼런스 입니다.

Type::new 형태로 사용할 수 있습니다.

public Greeting(String name) 생성자 참조

 

 

 

생성자 참조를 하는 메소드 레퍼런스 코드를 보면 Greeting::new;를 사용하여서 [타입::new] 형태로 같은 코드임을 알 수 있습니다. 하지만 Greeting 클래스의 참조하고 있는 생성자를 확인해 보면 서로 다른 생성자를 참조하고 있는것을 확인할 수 있습니다. 따라서 생성자 참조 메소드 레퍼런스는 어떤 생성자를 참조하고 있는지는 확인을 따로 하는것이 좋습니다.