메서드 참조

sungs·2025년 8월 30일

자바

목록 보기
85/95

메서드 참조

람다가 단순히 메서드를 호출해야할 경우 메서드 참조로 좀 더 간결하게 코드를 작성할 수 있다. 클래스명::메서드명 형태로 메서드 참조가 이루어진다.
람다에서 메서드만 호출하는 경우가 꽤 있어 자주 쓰인다. 대표적으로 System.out::println이 있다.

매개변술르 쓰지 않아도 되는 이유는 함수형 인터페이스의 시그니처를 통해 자동으로 추론되기 때문이다.

게다가 매개변수도 쓰지 않아도 돼서 더욱 간결하게 메서드를 호출할 수 있다.

List<Integer> numbers = Arrays.asList(1, 2, 3);
numbers.stream()
       .map(number -> String.valueOf(number)) // 이 부분!
       .forEach(System.out::println);
       
List<Integer> numbers = Arrays.asList(1, 2, 3);
numbers.stream()
       .map(String::valueOf) // 이렇게 바뀝니다.
       .forEach(System.out::println);
       

정적 메서드 참조

정적 메서드를 참조할 경우에는 클래스명::메서드명으로 간단하게 쓰면 된다. 위의 예시가 정적 메서드를 참조했을 경우다.

특정 객체의 인스턴스 메서드 참조

객체의 인스턴스 메서드를 참조할 경우에는 객체명::인스턴스메서드명으로 쓰면 된다.

생성자 참조

생성자를 참조할 때는 클래스명::new으로 쓰면 된다.

임의 객체의 인스턴스 메서드 참조

Function<Person, String> fun1 = (Person person) -> person.greeting(); 같은 특정 타입의 객체가 매개변수로 올 경우 Function<Person, String> fun1 = Person::greeting으로 쓸 수 있다. 즉, 클래스(타입)명::인스턴스 메서드명으로 해서 메서드를 참조할 수 있다. 특정 객체의 인스턴스 메서드 참조와 다른 점은 특정에서는 person 같은 객체명과 이미 컴파일 시점부터 어떤 객체를 들어올 지가 정해져 있지만, 임의 객체인 경우 Person 같은 타입과 어떤 객체가 들어올 지 정해지지 않고 런타임 시점에야 정해진다는 것이다.

매개변수가 둘 이상일 때는 첫번째 매개변수가 임의 객체 타입이 되고, 나머지가 차례대로 인자로 들어간다.

()를 쓰지 않는 이유

메서드 참조할 떄는 ()를 쓰지 않는다. ()는 주로 호출할 때 붙는 건데, 메서드 참조는 메서드 이름으로 참조만 하겠다는 것이기 때문이다. 실제 호출 시점은 함수형 인터페이스를 통해 나중에 일어난다.

profile
앱 개발 공부 중

0개의 댓글