Java

[Java8] 메소드 참조 (Method Reference)

나프초 2024. 7. 19. 22:24

메소드 참조(레퍼런스)

람다 표현식을 구현할 때 쓸 수 있는 방법

기존 메소드에 이미 기능이 구현되어있는 경우, 해당 메소드를 참조하여 함수형 인터페이스의 구현체로 쓰게 된다.

 

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