메서드 참조란?

메서드 참조는 특정 람다의 축약형이라고 생각할 수 있다.

메서드 참조를 이용하면 기존 메서드 정의를 재활용해서 람다처럼 전달할 수 있으며 때로는 람다 표현식보다 메서드 참조를 사용하는 것이 더 가독성이 좋으며 자연스러울 수 있다.

inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));// 람다 표현식
inventory.sort(compareTo(Apple::getWeight));// 메서드 참조

위 코드를 보면 Apple::getWeight는 Apple에 정의된 getWeight의 메서드 참조다. 메서드명 앞에 구분자(::)를 분해 방식으로 메서드 참조를 활용하였다.

메서드 참조를 이용하면 같은 기능을 더 간결하게 구현할 수 있어서 가독성을 높일 수 있다.

메서드 참조를 새로운 기능이 아니라 하나의 메서드를 참조하는 람다를 편리하게 표현할 수 있는 문법으로 간주하면 되겠다.


메서드 참조를 만드는 방법

메서드 참조는 세 가지 유형으로 구분할 수 있다.

1. 정적 메서드 참조

// 람다 표현식
ToIntFunction<String> stringToInt = (String s) -> Integer.parseInt(s);
// 메서드 참조
Function<String, Integer> stringToInteger = Integer::parseInt;

2. 다양한 형식의 인스턴스 메서드 참조

// 람다 표현식
BigPredicate<List<String>, String> contains = (list, element) -> list.contains(element);
// 메서드 참조
BigPredicate<List<String>, String> contains = List::contains;

3. 기존 객체의 인스턴스 메서드 참조

// 람다 표현식
Predicate<String> startsWithNumber = (String s) -> this.startsWithNumber(s);
// 메서드 참조
Predicate<String> startsWithNumber = this::startsWithNumber;

이 유형은 비공개 헬퍼 메서드를 정의한 상황에서 유용하게 활용할 수 있다.

https://blog.kakaocdn.net/dn/bUwSfG/btruMnFSTno/igRt3cjRtsEYjECHNr5Sa1/img.png


생성자 참조란?