티스토리 뷰

 대리님들이 자바8의 메서드 참조에 대해 말씀하시는걸 주워듣고 나도 이래저래 공부를 했는데 메서드 참조는 이해가 안 갔다. 그러다가 오늘 갑자기 깨달음을 얻어서 간단하게 정리해둔다.


 메서드 참조는 말그대로 메서드를 참조하는 것이다. 그렇다면 메서드를 왜 참조하느냐? 이미 있는 메서드를 사용하기 위해서이다.

public class Hello {

    private static final String HELLO = "안녕하세요!";

    public String sayHello() {
        return HELLO;
    }

    public String sayHello(String name) {
        return name + "님, " + HELLO;
    }

}

 위와 같은 클래스가 있다고 해보자. 이름을 입력하면 이 이름을 이용해서 인삿말을 출력하고 싶다고 하자. 그렇다면 String 입력값이 있고, String라는 반환값이 필요하므로 이때 사용할 수 있는 자바의 함수형 인터페이스는 UnaryOperator가 있다. 코드는 아래와 같다.

Hello hello = new Hello();
UnaryOperator<String> sayHelloName = hello::sayHello;

// 만약 static 메서드라면
// 바로 아래와 같이 쓸 수 있다.
UnaryOperator<String> sayHelloName = Hello::sayHello;

 설명하자면 이 경우 UnaryOperator은 String을 입력값으로, String를 반환값으로 한다.(UnaryOperator는 입력값과 반환값 타입이 같을 때 사용한다.) 이 UnaryOperator은 String 클래스의 sayHello를 참조하는데, 위 두 개의 메서드 중 이 경우 참조하는 것은 sayHello(String name)이다. 이유는? UnaryOperator<String>으로 입력값이 String이라는 것을 명시했기 때문이다.

 그렇다면 입력값없이 인삿말을 출력하고 싶다면?

Hello hello = new Hello();
Supplier<String> sayHelloNoName = hello::sayHello;

// 만약 static 메서드라면
// 바로 아래와 같이 쓸 수 있다.
Supplier<String> sayHelloNoName = Hello::sayHello;

 이때, 이름을 입력값으로 하는 sayHelloName와 메소드 참조의 형태는 같지만 그것과는 다르게 파라미터가 없는 sayHello()를 사용한다. 이유는? Supplier는 입력값이 없고 반환값만 있는 타입이기 때문이다.

 자바에서 기본 제공하는 함수형 인터페이스 중 어떤 상황에 어떤 것을 사용해야 할지 알고 싶다면 이곳 을 참고하자.

 


 그리고 중요한 사실은 메서드 참조는 메서드 참조가 끝이라는 것이다.

UnaryOperator<String> sayHelloName = hello::sayHello;
Supplier<String> sayHelloNoName = hello::sayHello;

 위 두 메서드 모두 그냥 hello의 sayHello를 참조하는 대상을 만든 것 뿐이다. 생성자 메서드를 적어놨다고 그 클래스가 만들어지지 않는 것처럼.

 그래서 실제로 메서드 참조를 실행시키려면 아래와 같다.

Hello hello = new Hello();

UnaryOperator<String> sayHelloName = hello::sayHello;
String judy = sayHelloName.apply("judy");
System.out.println(judy); // judy님, 안녕하세요!

Supplier<String> sayHelloNoName = hello::sayHello;
String noName = sayHelloNoName.get();
System.out.println(noName); // 안녕하세요!

 이렇게 각 함수형 인터페이스에 존재하는 추상메서드를 사용해야 한다.

300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함