메서드 참조
- 메서드 참조란 람다식을 더욱 간단히 표현한 것이다.
- 단, 항상 간단히 사용할 수 있는것은 아니고, 람다식이 하나의 메서드만 호출하는 경우에는 ‘메서드 참조(method reference)’라는 방법으로 람다식을 간략히 할 수 있다
- 참조하는 종류는 1. static 메서드 참조와 2. 인스턴스메서드 참조가 있다.
- 표현방식은 다음과 같다
클래스 이름::메서드 이름
- 메서드는 다른 클래스에도 동일한 이름이 존재할 수 있기 때문에 앞에 클래스 이름은 반드시 필요하다.
- 람다식의 일부가 생략되었지만, 컴파일러는 생략된 부분을 우변의 parselnt메서드의 선언부로부터, 또는 좌변의 Function인터페이스에 지정된 지네릭 타입으로부터 쉽게 알아내는 식이다.
- 특정 객체 인스턴스메서드 참조는 사용빈도가 낮다.

- 반환형이 Integer인 static 메서드를 람다식으로 표현하면 다음과 같다.
- Function<String, Integer> f = (String s) -> Integer.parseInt(s);
- 이때 Function 타입으로 받은 이유는 입력값과 출력값이 하나씩 존재하기 때문이다.
- (String s) 는 생략이 가능하다. 왜냐하면 이미 Funtion의 입력값으로 작성되어있기때문에 유추가 가능하기 때문이다.
- 입력 변수를 의미하는 parseInt(s)의 (s)역시 생략가능하다.
- 이미 반환형에 입력값이 존재함이 명시되어있기 때문이다.
- 메서드 참조형의 표현방식인 클래스명::메소드명으로 변환하면 다음과같다.
- Integer::parseInt
- 메서드 참조를 사용할 수 있는 경우가 한가지 더 있는데,
- 이미 생성된 객체의 메서드를 람다식에서 시용한 경우에는 클래스 이름 대신 그 객체의 참조변수를 적어줘야 한다.
- 하나의 메서드만 호출하는 람다식은 ‘클래스이름::메서드이름’또는‘참조변수::메서드이름’으로 바꿀 수 있다.

- 예제로 테스트 해본다.
- 입력값과 출력값이 존재하므로 java.util.function 패키지 내 Function 메소드를 사용한다.
- 그러므로 메소드 옆 <T, R> 값은 각각 입출력이 된다.
- 이를 람다식으로 표현하면 다음과 같을 것이다.

- 메소드 참조형은 람다식을 더 간단히 작성하여 [클래스이름::메소드이름]으로 작성하기로 하였으므로
- 클래스 이름자리에는 Integer가, 메소드 이름자리에는 parseInt가 들어가면 된다.
- 생략이 가능한 이유는 참조형 메서드인 Function메서드에서 이미 입출력값의 유무, 입출력값의 형식 등이 유추가 가능하기 때문이다.
- 연습을 위해 메소드 참조형을 다시 람다식으로 바꿔보는것도 좋다.


생성자의 메서드 참조
- 생성자를 호출하는 람다식도 메서드 참조로 변환할 수 있다.
- 클래스명::new 로 작성한다.
- 입력값이 없을때는 반환값, 즉 새로운 객체만 계속적으로 반환하므로 java.util.function 패키지 내 Supplier 메서드를 사용한다.
- 입력값이 있을때는 입력값, 반환값이 하나씩 있으므로 java.util.function 패키지 내 Function 메서드를 사용한다.

- 입력값이 2개 인경우엔 BiFunction<T, U, R>을 사용한다.
- 이때 입력값은 T, U에 해당한다.

- 배열을 메서드 참조하기 위해서 메서드의 반환값을 배열형식으로 지정한다.
- Funtion<Integer, int[ ]> ... 와 같이 사용한다.
- 이를 생성자의 메서드 참조형으로 바꿀시엔 클래스명자리에 배열타입( int[ ] ) 을 사용한다.

예제를 통해 생성자호출을 메서드 참조를 이용해 표현해보자.
생성자 호출시 입력값은 없고 새로운 객체만 계속해서 반환하고싶으므로 Supplier를 사용한다.
Supplier의 기본 메소드는 get 이다.

- 생성자의 메소드 참조형은 클래스이름::new 로 작성한다.


- 새로운 객체를 반환하므로 두번 생성된 객체는 같은 대상이아니다.
- 콘솔창의 결과를 보면 각각 생성된 객체의 주소값이 다른 것을 확인할 수 있다.

- 입력값이 있는 생성자 생성에서도 메서드 참조형은 MyClass::new로 동일하게 작성된다.
- 입력값 (i)가 생략된 이유는 Function 메소드 탓이다.
- 해당메소드는 입력값과 출력값이 하나씩 있는 경우에 사용하므로,
- 이미 입력값이 있다는 것과 그 입력값의 타입은 Integer이란 것을 유추할 수 있기 때문이다.

- 반환타입이 배열타입일 때도 메서드 참조형은 동일하게 작성한다.
- 배열생성시엔 반드시 Function 메서드를 사용해야한다.
- 입력값과 출력값이 둘다 있기 때문인데
- 이때 입력값은 배열의 길이, 출력값은 배열이 될 것이다.


'Programming > JAVA' 카테고리의 다른 글
| 자바의 정석 ch14-17~22 : 스트림 만들기 (0) | 2023.04.24 |
|---|---|
| 자바의 정석 ch14-15,16 : 스트림, 스트림의 특징 (0) | 2023.04.24 |
| 자바의 정석 ch14-9~12 : Predicate의 결합, CF와 함수형 인터페이스 (0) | 2023.04.18 |
| 자바의 정석 ch14-7,8 : java.util.function 패키지 (0) | 2023.04.18 |
| 자바의 정석 ch14-5,6 : 함수형 인터페이스 (0) | 2023.04.17 |