[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]




[출처]

  • 자바의정석 (저자: 남궁성)