JaPark Bug World

[JAVA] 함수형 인터페이스와 람다 - 메소드 레퍼런스 본문

개발새발/더 자바, Java 8

[JAVA] 함수형 인터페이스와 람다 - 메소드 레퍼런스

JAstory 2024. 4. 1. 10:02

메소드 레퍼런스

람다가 하는 일이 기존 메소드 또는 생성자를 호출하는 거라면, 메소드 레퍼런스를 사용해서 매우 간결하게 표현할 수 있다.

 

메소드 참조하는 방법

스태틱 메소드 참조 타입::스태틱 메소드
특정 객체의 인스턴스 메소드 참조 객체 페퍼런스::인스턴스 메소드
임의 객체의 인스턴스 메소드 참조 타입::인스턴스 메소드
생성자 참조 타입::new
  • 메소드 또는 생성자의 매개변수로 람다의 입력값을 받는다.
  • 리턴값 또는 생성한 객체는 람다의 리턴값이다. 

이해를 돕기 위해 만들어 둔 Greeting Class

public class Greeting {
    private String name;
    public Greeting() {}

    public Greeting(String name) {
        this.name = name;
    }
    public String hello(String name) {
        return "hello " + name;
    }
    public static String hi(String name) {
        return "hi " + name;
    }
    public String getName() {
        return name;
    }
}

스태틱 메소드 참조

UnaryOperator<String> hi = Greeting::hi; // 해당 문법만 가지고는 아무일도 일어나지 않음. 
hi.apply("jp"); // apply 까지 해줘야 함.

// 기존 방식 
Greeting.hi("jp");

특정 객체의 인스턴스 참조

UnaryOperator<String> hello = greeting::hello;
hello.apply("jp");

// 기존방식
Greeting greeting = new Greeting();
greeting.hello("jp");

임의 객체의 인스턴스 메소드 참조

String[] names = {"jp", "park", "jing"};
Arrays.sort(names, String::compareToIgnoreCase);
System.out.println(Arrays.toString(names));
// 결과값 : [jing, jp, park]

String::compareToignoreCase 이 내용인것 같은데.. 이해가 잘 안된다........


매개변수가 없는 생성자 참조

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

// 기존 방식
Greeting newGreeting = new Greeting();

매개변수가 있는 생성자 참조

Function<String, Greeting> jpGreeting = Greeting::new;
Greeting jp = jpGreeting.apply("jp");
jp.getName();

// 기존 방식
Greeting newGreeting = new Greeting("jp");
newGreeting.getName();

예제가 간단해서 그런지 람다식이 더 간결하다는게 아직 체감이 되지 않는다.. 많이 써봐야겠다....


인프런 더 자바, Java8 백기선님 강의를 참고하여 정리한 내용입니다.