[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 클래스의 참조하고 있는 생성자를 확인해 보면 서로 다른 생성자를 참조하고 있는것을 확인할 수 있습니다. 따라서 생성자 참조 메소드 레퍼런스는 어떤 생성자를 참조하고 있는지는 확인을 따로 하는것이 좋습니다.
'JAVA > JAVA8' 카테고리의 다른 글
[Java8] 인터페이스 default 메소드 / static 메소드 (0) | 2024.09.02 |
---|---|
[Java8] 람다 표현식 : 스코프(Scope), 쉐도잉(Shadowing) (0) | 2024.08.29 |
[Java8] JAVA가 제공하는 기본 함수형 인터페이스 정리 (0) | 2024.08.25 |
[Java8] 함수형 인터페이스, 람다식 변경 방법 (0) | 2024.08.25 |