[JAVA] 람다와 스트림 ( Lambda & Stream ) ⑤

DongGyu Jung·2022년 4월 30일
0

자바(JAVA)

목록 보기
53/60
post-thumbnail

🏃‍♂️ 들어가기 앞서..

본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕

*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.



메서드 참조 (method reference)

하나의 메서드만 호출하는 람다식을

  • 클래스 이름::메서드 이름
  • 참조변수 이름::메서드 이름

형식으로 더 간단한 람다식 표현을 할 수 있다.

  • static메서드 참조 : (x) -> ClassName.method(x)ClassName::method
    : 아래서 볼 수 있듯 참조변수 fFunction<String, Integer> 타입을 통해
    이미 입력값은 String 타입이라는 것을 알 수 있기 때문에
    람다식에서의 (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 ;

감히 메서드 참조를 간략하게 한 마디로 정리해보자면
람다식 치환이라고 할 수 있을 것 같다.

0개의 댓글