메소드 참조(레퍼런스)
람다 표현식을 구현할 때 쓸 수 있는 방법
기존 메소드에 이미 기능이 구현되어있는 경우, 해당 메소드를 참조하여 함수형 인터페이스의 구현체로 쓰게 된다.
public class Greeting {
private String name;
public Greeting() {
}
public Greeting(String name) {
this.name = name;
}
public String hello(String name) { //instance method
return "hello " + name;
}
public static String hi(String name) { //static method
return "hi " + name;
}
}
public class App {
public static void main(String[] args) {
UnaryOperator<String> newHi = (s) -> "hi " + s;
}
}
Greeting 클래스의 hi 메소드와 메인 메소드에서 호출하는 newHi 메소드는 결과적으로 동일한 기능을 갖는다.
이럴 때 메소드 레퍼런스를 사용할 수 있다.
public class App {
public static void main(String[] args) {
UnaryOperator<String> hi = Greeting::hi; //method reference
}
}
이 때 Greeting의 hi 메소드를 호출한 것이 아니라는 것에 주의해야한다.
해당 메소드를 참조하여 동일한 기능을 갖는 새로운 newHi 라는 메소드를 정의했을 뿐, 메소드가 호출된 것은 아니다!!
메소드 참조 방법
- static 메소드 참조 -> 타입::method
- 특정 객체의 인스턴스 메소드 참조 -> 객체 레퍼런스::method
- 임의 객체의 인스턴스 메소드 참조 -> 타입::method
- 생성자 참조 -> 타입::new
public class App {
public static void main(String[] args) {
/*스태틱 메소드 참조*/
UnaryOperator<String> hi = Greeting::hi;
/*특정 인스턴스 메소드 참조*/
Greeting grt = new Greeting();
UnaryOperator<String> hello = grt:hello;
hello.apply("cy"); //이 때 데이터가 메소드에 전달되고 출력됨
/*생성자 참조 (입력값 있는 생성자 호출)*/
Function<String, Greeting> ngrt1 = Greeting::new;
ngrt1.apply("cy"); //이 때 인스턴스가 생성됨
/*생성자 참조 (입력값 없는 생성자 호출)*/
Supplier<Greeting> ngrt2 = Greeting::new;
ngrt2.get(); //이 때 인스턴스가 생성됨
/*임의 인스턴스 메소드 참조(입력값 있는 생성자 호출)*/
String[] names = {"cy", "sm", "ks"};
Arrays.sort(names, String::compareToIgnoreCase);
}
}
이 포스팅은 더 자바, Java 8 강의를 수강하며 작성되었습니다.
더 자바, Java 8 강의 | 백기선 - 인프런
백기선 | 자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합
www.inflearn.com
'Java' 카테고리의 다른 글
[Java8] Java8 API의 메소드 (0) | 2024.07.25 |
---|---|
[Java8] 인터페이스 메소드 (2) | 2024.07.22 |
[Java8] 람다 표현식 (lambda) (0) | 2024.07.14 |
[Java8] 자바에서 제공하는 함수형 인터페이스 (1) | 2024.07.14 |
[Java8] 함수형 인터페이스 (0) | 2024.07.13 |