반응형
람다가 하는 일이 기존 메소드 또는 생성자를 호출하는 거라면, 메소드 레퍼런스를 사용해서 매우 간결하게 표현할 수 있다.
메소드 레퍼런스
- 람다 표현식을 구현할 때 사용할 수 있는 방법
- 새로 구현하는 것이 아니라 기존에 이미 존재하는 메소드를 참조해서 사용
- 메소드 레퍼런스만 보고는 어떤 메소드인지 구분이 되지 않을 수 있다.
- 함수형 인터페이스까지 확인해야한다.
메소드 참조하는 방법
- 스태틱 메소드 참조
타입::스태틱 메소드
- 특정 객체의 인스턴스 메소드 참조
객체 레퍼런스::인스턴스 메소드
- 임의 객체의 인스턴스 메소드 참조
타입::인스턴스 메소드
- 생성자 참조
타입::new
- 메소드 또는 생성자의 매개변수로 람다의 입력값을 받는다. 리턴값 또는 생성한 객체는 람다의 리턴값이다.
메소드 레퍼런스 예제
/*
메소드 레퍼런스 클래스
*/
class Greeting {
private String name;
//1) 생성자 참조
public Greeting(){
}
//2) 생성자 참조
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 "hi " + name;
}
}
public class MethodReference {
public static void main(String[] args){
UnaryOperator<String> hi = (s) -> "hi " + s;
//위와 같은 기능을 하는 것이 이미 구현되어 있다면 직접 구현하지않고 메소드 레퍼런스를 활용해서 사용가능
/* 1. 스태틱 메소드 참조 */
UnaryOperator<String> hi2 = Greeting::hi;
System.out.println(hi2.apply("DevHistory"));
/* 2. 특정 객체의 인스턴스 메소드 참조 */
Greeting greeting = new Greeting();
UnaryOperator<String> hello = greeting::hello;
System.out.println(hello.apply("DevHistory"));
/* 3. 생성자 참조 */
//1), 2)의 메소드 레퍼런스는 서로 같아보이지만 실제로는 다른 생성자를 참조한다.
//1) 매개변수가 없는 생성자
Supplier<Greeting> newGreeting = Greeting::new;
Greeting greeting1 = newGreeting.get();
System.out.println("1) 매개변수가 없는 생성자 : " + greeting1.getName());
//2) 매개변수가 존재하는 생성자
Function<String, Greeting> devHistoryGreeting = Greeting::new;
Greeting devHistory = devHistoryGreeting.apply("DevHistory");
System.out.println("2) 매개변수가 존재하는 생성자 : " + devHistory.getName());
/*
4. 특정 타입의 불특정 다수 인스턴스의 메소드 참조
== 임의 객체의 인스턴스 메소드 참조
*/
String[] names = {"history", "java8", "dev"};
//Comparator: String 값을 입력받아 int 값을 반환. 비교를 위한 용도
//String 클래스에 정의된 compareToIgnoreCase 메소드를 이용할 수 있다.(내부에서 Comparator 사용)
//배열의 요소 각각마다 자기 자신과 다음 인자를 비교해가며 정렬 수행
Arrays.sort(names, String::compareToIgnoreCase);
System.out.println(Arrays.toString(names));
}
}
반응형
'Java > 기본' 카테고리의 다른 글
자바 인터페이스(Java Interface) 변화 - 2 (자바8 인터페이스 구조 변화) (0) | 2021.06.24 |
---|---|
자바 인터페이스(Java Interface) 변화 - 1 (기본 메소드, 스태틱 메소드) (0) | 2021.06.22 |
자바 람다(Java Lambda) - 3 (람다 표현식 사용 조건) (0) | 2021.06.17 |
자바 람다(Java Lambda) - 2 (자바 함수형 인터페이스) (0) | 2021.06.16 |
자바 람다(Java Lambda) - 1 (함수형 인터페이스, 람다 표현식) (0) | 2021.06.15 |
[참고자료]
더 자바, Java 8, 백기선
The Java™ Tutorials - Method References