티스토리 뷰
대리님들이 자바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); // 안녕하세요!
이렇게 각 함수형 인터페이스에 존재하는 추상메서드를 사용해야 한다.
'공부흔적 > 자바' 카테고리의 다른 글
파일업로드 테스트(MultipartFile.getByte, MultipartFile.transferTo, MultipartFile.getInputStream) (0) | 2022.06.21 |
---|---|
try-with-resources와 AutoCloseable 인터페이스 (0) | 2022.04.04 |
Logback 설정에 관하여 (0) | 2022.02.23 |
dead code 원인 찾기 (0) | 2022.01.18 |
자바의 GC(Garbage Collection) (0) | 2021.12.07 |