이론 정리/java

메서드 참조

철매존 2023. 1. 8. 00:48
728x90

메서드 참조(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; // 메서드 참조

가 될 것이다.

이게 가능한 이유는 함수형 인터페이스에 관련 정보가 있기 때문이다.

그래서 메서드 참조를 보고 잘 이해가 안되면

  1. 입력, 출력을 한번 본다.
  2. 그걸 통해서 다시 클래스이름::메서드이름 이라는것을 보고 람다식으로 바꿔서 본다.

이렇게 해서 람다식으로 다시 바꿔봐서 그걸로 이해해 보자.

생성자와 메서드 참조

매개변수가 없는 경우

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;

가 될것이다.