🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕
*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.
method reference
)하나의 메서드만 호출하는 람다식을
클래스 이름::메서드 이름
참조변수 이름::메서드 이름
형식으로 더 간단한 람다식 표현을 할 수 있다.
(x) -> ClassName.method(x)
▶ ClassName::method
f
는 Function<String, Integer>
타입을 통해(String s)
부분이 필요가 없어진다.// 기존 메서드
Interger chgInt(String s) {
return Integer.parseInt(s) ;
}
//람다식으로 바꾸기
Function<String,Integer> f = (String s) -> Integer.parseInt(s) ;
// 메서드 참조 방법으로 바꾸기
Function<String,Integer> f = Integer::parseInt ; // 직접 호출
(obj.x) -> obj.method(x)
▶ ClassName::method
(x) -> obj.method(x)
▶ obj::method
위에서 Function<T,R>
인터페이스
즉, 입력값과 출력값이 있는 경우의 메서드 참조 방식을 알아봤다.
하지만 여기서 끝이 아니라
메서드 참조 방식으로 그 외의 인터페이스를 사용하는 람다식 또한
메서드 참조 방식으로 바꿀 수 있고
특정 연산뿐만 아닌
생성자까지 메서드 참조 방식으로 만들 수 있다.
* 생성자는 매개변수 없이 하나의 인스턴스를 만들어 줄 수도 있기 때문에 Supplier
인터페이스 사용이 가능하다.
// 람다식 생성자
Supplier<MyClass> s = () -> new MyClass() ;
이 생성자 람다식을
앞서 알아봤던 방법을 통해 메서드 참조를 하면 된다.
단, 메서드이름을 등록하는 부분엔
생성자 메서드인 new
만 붙인다.
Supplier<MyClass> s = MyClass::new ;
정말 간단해지는 것을 볼 수 있다.
만약 매개변수가 필요한 생성자의 경우는
어렵게 생각할 필요없다.
양식에 맞게끔 인터페이스를 활용하기만 하면 된다.
( 입력값과 출력값, 즉 생성자 매개변수와 반환되는 객체 타입이 인터페이스 제네릭을 통해 입력되어 있기 때문이다. )
Function<Integer, MyClass> f = (i) -> new MyClass(i) ; //람다식
Function<Integer, MyClass> f = MyClass::new ;
// 매개변수가 2개 이상인 경우
BiFunction<Integer, String, MyClass> f2 = (i, s) -> new MyClass(i, s) ;
BiFunction<Integer, String, MyClass> f2 = MyClass::new ;
배열 생성하는 경우라면?
어렵지 않다!
배열 생성할 땐,
크기(길이)를 정해주는 것을 기억할 것이다.
크기를 정해주는 식을 먼저 람다식으로 표현해 보자.
Function<Integer, int[]> arrF = x -> new int[x] ;
여기서
방금전 여느 생성자를 만들 때와 동일하게 ::new
를 사용해주고
제네릭에 입력값 Integer가 있기 때문에
매개변수를 굳이 입력할 필요 없이 int[]
를 앞에 붙여주면된다.
Function<Integer, int[]> arrF = int[]::new ;
// String 배열이라면
Function<Integer, String[]> arrF2 = String[]::new ;
감히 메서드 참조를 간략하게 한 마디로 정리해보자면
람다식 치환이라고 할 수 있을 것 같다.