[Java] 19. 메서드 참조(method reference)
람다식을 더욱 간결하게 표현할 수 있는 방법이 있다. 람다식이 하나의 메서드만 호출하는 경우에는 메서드 참조(method reference)
로 람다식을 더 간결하게 할 수 있다. 해당 포스팅은 메서드참조의 예제이다.
1. 메서드참조는 '클래스이름::메서드이름'
형태
아래와 같이 Static 메서드의 람다식으로 변환 된 예제코드에서 메서드참조에 대해 접근해보자. Function 함수형 인터페이스에 Function<매개변수 타입, 반환 타입>
와 같이 이미 타입이 정의되어 있기 때문에 메서드참조형으로 변환시에 매개변수는 작성할 필요가 없어지면서 코드가 더 간결해진다.
1-1. Function x Static 메서드의 메서드참조
예제
public static int method (String) {
return Integer.parseInt(s);
}
일반 람다식
Function<String, Integer> method = (String s) -> Integer.parseInt(s);
Function<String, Integer> method = s -> Integer.parseInt(s);
메서드 참조
Function<String, Integer> method = Integer::parseInt;
Function의 함수형 인터페이스는 하나의 매개변수를 받아 결과 반환하기 때문에 method는 apply 메서드를 통해서 호출된다.
String s = "123";
int result = method.apply(s);
1-2. Supplier x 생성자 생성의 메서드참조
예제
아래코드는 함수형 인터페이스 Supplier<T>
와 Function<T,R>
로 메서드참조 예제 코드이다.
- Supplier<T> : 매개변수는 없고, 반환값만 존재
- Function<T,R> : 일반적인 함수. 하나의 매개변수를 받아 결과 반환
Supplier 는 매개변수가 없기에 기본생성자 예제이며, Function 은 매개변수와 반환값이 있기에 매개변수가 있는 생성자로 강의실번호가 있는 객체 생성 예제이다.
public class ExIfSupplier {
public static void main(String[] args) {
//1. Supplier 인터페이스 함수형으로 메서드참조형태 "기본생성자 생성"
//Supplier<Lecture> lectureSupplier = () -> new Lecture();
Supplier<Lecture> lectureSupplier = Lecture::new;
int lecturerId = lectureSupplier.get().getLecturerRoomNo();
List<String> StudentList = lectureSupplier.get().getStudents();
System.out.println("# [강의실 미정] 강의실: " + lecturerId + ", 강의실_수강생 정보: " + StudentList);
//=> # 강의실 : 0, 강의실 x 수강생 : [0_S123, 0_S313, 0_S731]
//2. Function 인터페이스 함수형으로 강의실번호라는 매개변수가 있는 "매개변수 생성자 생성"
//Function<Integer, Lecture> lectureFunction = (lecturerRoomNo) -> new Lecture(lecturerRoomNo);
Function<Integer, Lecture> lectureFunction = Lecture::new;
int roomNo = 431; //강의실 번호
lecturerId = lectureFunction.apply(roomNo).getLecturerRoomNo();
StudentList = lectureFunction.apply(roomNo).getStudents();
System.out.println("# [강의실 지정] 강의실: " + lecturerId + ", 강의실_수강생 정보: " + StudentList);
}
}
//강의 Class
class Lecture {
private int lecturerRoomNo = 0;
//기본생성자
public Lecture() {}
//매개변수 생성자
public Lecture(int lecturerRoomNo) {
this.lecturerRoomNo = lecturerRoomNo;
}
public int getLecturerRoomNo() {
return this.lecturerRoomNo;
}
public List<String> getStudents() {
List students = new ArrayList<>();
students.add(this.lecturerRoomNo + "_S123");
students.add(this.lecturerRoomNo + "_S313");
students.add(this.lecturerRoomNo + "_S731");
return students;
}
}
# [강의실 미정] 강의실: 0, 강의실_수강생 정보: [0_S123, 0_S313, 0_S731]
# [강의실 지정] 강의실: 431, 강의실_수강생 정보: [431_S123, 431_S313, 431_S731]
[출처]
- 자바의정석 (저자: 남궁성)