메서드 참조
메서드 참조(Method reference)
하나의 메서드만 호출하는 람다식은
메서드 참조
로 더 간단히 할 수 있다.
종류 | 람다 | 메서드 참조 |
---|---|---|
static메서드 참조 | (x) -> ClassName.method(x) | ClassName::method |
인스턴스메서드 참조 | (obj, x) -> obj.method(x) | ClassName::method |
특정 객체 인스턴스메서드 참조 | (x) -> obj.method(x) | obj::method |
사용법은 그냥
클래스이름::메서드이름
으로 적어주는거임.
저중에서 특정 객체 인스턴스메서드 참조는 잘 안쓰이고, 위의 두개가 쓰인다.
Static 메서드 참조
Integer method(String s) { // 그저 Integer.parseInt(String s) 만을 호출
return Integer.parseInt(s);
}
그래서
int result = obj.method("123");
저 메소드를 사용하면 그냥
int result = Integer.parseInt("123");
이렇게 되는데 람다식으로 하면
Function<String, Integer> f = (String s) -> Integer.parseInt(s);
요렇게 될것이다.
그리고 Function에서 입/출력 정보도 이미 있다.
이거를 이제 메소드 참조로 바꾸면
Function<String, Integer> f = Integer::parseInt; // 메서드 참조
가 될 것이다.
이게 가능한 이유는 함수형 인터페이스에 관련 정보가 있기 때문이다.
그래서 메서드 참조를 보고 잘 이해가 안되면
- 입력, 출력을 한번 본다.
- 그걸 통해서 다시 클래스이름::메서드이름 이라는것을 보고 람다식으로 바꿔서 본다.
이렇게 해서 람다식으로 다시 바꿔봐서 그걸로 이해해 보자.
생성자와 메서드 참조
매개변수가 없는 경우
Supplier<MyClass> s = () -> new MyClass();
가 있다고 하자.
이거는 Supplier니까 입력이 없고, return만 있다.
그래서 이 결과로는 MyClass 객체만 return하게 될 것이다.
이는 메서드 참조로는
Supplier<MyClass> s = MyClass::new;
가 될것이다.
매개변수가 1개인 경우
Function<Integer, MyClass> s = (i) -> new MyClass(i);
이거도 이제
Function<Integer, MyClass> s = MyClass::new;
이렇게 변경 가능하다.
어차피 입력이 어떻게 들어올지는 앞의 함수형 인터페이스에서 선언해서 알 수 있기 때문.
배열과 메서드 참조
Function<Integer, int[]> f = x -> new int[x];
이거는 배열의 길이를 주면 해당 배열을 return하는 것인데
function<Integer, int[] f2 = int[]::new;
가 될것이다.