본문 바로가기
DEV/Java

[자바] 메소드 참조

by 어쩌다개발 2023. 2. 23.
반응형

Function<String, Integer> f = (String s) -> Integer.parseInt(s);

위 람다식을 표현하면 아래와 같다.

Integer wrapper(String s) {	//메서드 이름은 의미없음.
	return Integer.parseInt(s);
}

이 때 wrapper 메서드는 그저 값을 받아와서 Integer.parseInt()에게 넘겨주는 일만 한다. 이때 거추장스러운 메소드를 벗겨내고 Integer.parseInt()를 아래와 같이 직접 호출할 수 있다.

Function<String, Integer> f = Integer::parseInt; //메서드참조

컴파일러는 생략된 부분을 우변의 parseInt메서드의 선언부로부터, 또는 좌변의 Function 인터페이스에 지정된 제네릭 타입으로부터 쉽게 알아낼 수 있다.
또 다른 예시를 보면 아래와 같이 메소드 참조로 표현 할 수 있다.

BiFunction<String, String, Boolean> f = (s1, s2) -> s1.equals(s2);
BiFunction<String, String, Boolean> f = String::equals;

이 외에도 메서드 참조를 사용할 수 있는 경우가 한 가지 더 있는데, 이미 생성된 객체의 메서드를 람다식에서 사용한 경우에는 클래스 이름 대신 그 객체의 참조변수를 적어줘야 한다.

MyClass obj = new MyClass();
Function<String, Boolean> f = (x) -> obj.equals(x); //람다식
Function<String, Boolean> f2 = obj::equals;			//메서드 참조​

 

 

static 메서드 참조 (x) -> ClassName.method(x) ClasssName::method
인스턴스 메서드 참조 (obj, x) -> obj.method(x) ClassName::method
특정 객체 인스턴스메서드 참조 (x) -> obj.method(x) obj::method

하나의 메서드만 호출하는 람다식은 '클래스이름::메서드이름' 또는 '참조변수::메서드이름' 으로 변경할 수 있다.

 

생성자 메서드 참조

Supplier<MyClass> s = () -> new MyClass();
Supplier<MyClass> s = MyClass::new;
//매개변수가 있는 생성자
Function<Integer, MyClass> f = (i) -> new MyClass(i);
Function<Integer, MyClass> f2 = MyClass::new;

BiFunction<Integer, String, MyClass> bf = (i, s) -> new MyClass(i, s);
BiFunction<Integer, String, MyClass> bf2 = MyClass::new;

//배열 생성
Function<Integer, int[]> f = x -> new int[x];
Function<Integer, int[]> f = int[]::new;



참고 : 자바의정석

반응형

댓글