얄코의 제대로 파는 자바/섹션9 함수형 프로그래밍
메서드 참조
백엔드 개발자
2024. 8. 11. 12:04
메소드 참조
- 람다식 코드를 간편화 하는 것
- 메소드 1개만 호출할 경우
- 람다식과 메서드의 의미가 사실상 같은 경우
- 인터페이스와 메서드가 인자, 리턴값 구성이 동일할 경우
예시
# 클래스 메소드 호출
{클래스명}::{클래스 메소드명}
# 인스턴스 메소드 호출
{클래스명}::{인스턴스메소드명}
{인스턴스}::{인스턴스메소드명}
# 클래스 생성자 호출
{클래스}::new
// 클래스의 클래스 메소드에 인자 적용하여 실행
Function<Integer, String> intToStrLD = (i) -> String.valueOf(i);
Function<Integer, String> intToStrMR = String::valueOf;
String intToStr = intToStrMR.apply(123);
- String.valueOf()는 int를 인자로 받아서 String을 리턴한다.
- Function<a,b>는 a를 인자, b를 반환타입으로 하므로 valueOf와 일치한다.
- 메서드 1개만 사용하므로, 메서드 참조로 줄일 수 있는 것이다.
어려우면 IDE 자동 수정 기능이 있으니 람다식 정도까지만 고려하자. 알아서 바꿔줄 수 있으니!
예시
public class Button {
private String text;
public Button(String text) { this.text = text; }
public Button(String text, String sound) {
this(text);
onClickListener = () -> System.out.println(sound + " " + sound);
}
public String getText() { return text; }
private Runnable onClickListener;
public void setOnClickListener(Runnable onClickListener) {
this.onClickListener = onClickListener;
}
public void onClick () {
onClickListener.run();
}
}
// 클래스의 생성자 실행
Function<String, Button> strToButtonLD = s -> new Button(s);
Function<String, Button> strToButtonMR = Button::new;
Button button1 = strToButtonMR.apply("Dog");
- Function은 1번째 인자, 2번째 반환값. Button 생성자도 String 인자, 반환 Button 객체이므로 메서드 참조가 성립한다.
System.out.println("\n- - - - -\n");
// 현존하는 인스턴스의 메소드 실행
Runnable catCryLD = () -> button2.onClick();
Runnable catCryMR = button2::onClick;
catCryMR.run();
- onClick은 인스턴스의 메서드이므로, 인스턴스명::메서드로 변환한다.
번외
// 💡 임의의 인스턴스의 메소드 참조
TreeSet<String> treeSetLD = new TreeSet<>((s1, s2) -> s1.compareTo(s2));
TreeSet<String> treeSetMD = new TreeSet<>(String::compareTo);
- 임의의 인스턴스메서드를 참조하는 케이스. (이런 것도 있다는 느낌으로 참고만. 어차피 IDE가 바꿔줌)
출처
학습 페이지
www.inflearn.com