메서드 참조란?
특정 메서드를 호출하는 람다의 축약형으로, 명시적 메서드명 참조를 통해 가독성을 높이는 역할을 한다.
4.1 메서드 참조의 기본 문법
지난 포스트에서 Consumer, Predicate, Function 등의 인터페이스에서 람다를 활용하는 방법에 대해 알아보았습니다. 람다 표현식이라는 문법 자체가 익명 함수의 축약형이지만, 가독성과 간결성을 더 높이는 방법이 있는데, 그것이 바로 메서드 참조를 이용하는 것입니다. 메서드 참조는 메서드의 이름 앞에 ::
구분자를 붙여서 사용합니다.
Function<Book, Category> getCategoryFunction = (Book book) -> book.getCategory();
이 코드를 다음과 같이 변경할 수 있습니다.
Function<Book, Category> getCategoryFunction = Book::getCategory;
4.2 메서드 참조의 종류
- static 메서드 참조
- Math 클래스의 abs 메서드 -> Math::abs
- Long 클래스의 parseLong 메서드 -> Long::parseLong
- 인스턴스 메서드 참조
- String 클래스의 인스턴스 메서드 length: 람다 표현식 (String s) -> s.length()를 String::length로 대체할 수 있습니다.
- 예시 코드에 있던 Book::getCategory 또한 이 참조에 해당합니다.
- 외부 객체의 인스턴스 메서드 참조
- 예를 들어 Book book = new Book("title") 이러한 인스턴스가 있고 (String title) -> book.setTitle(title) 이라는 람다 표현식을 쓰고 싶을 때, 이를 book::setTitle로 변경할 수 있습니다.
4.3 생성자 참조
생성자 참조는 말 그대로 클래스의 생성자 메서드를 참조하는 것인데 ClassName::new의 형태로 적용할 수 있습니다.
Supplier<Book> bookSupplier = () -> new Book();
생성자 참조를 활용하면, 이 코드를 다음과 같이 간결하게 수정할 수 있습니다.
Supplier<Book> bookSupplier = Book::new;
매개변수가 있는 Fucntion 인터페이스에도 적용할 수 있고 다음과 같이 활용할 수 있습니다.
Function<String, Book> getNewBook = Book::new; // (String title) -> new Book(title) 과 동일
List<String> titles = Arrays.asList("title1", "title2", "title3");
List<Book> booksWithTitle = map(titles, getNewBook);
public List<Book> map(List<String> titles, Function<String, Book> bookMaker) {
List<Book> books = new ArrayList<>();
for (String title : titles) {
result.add(bookMaker.apply(title));
}
return books;
}
4.4 동작 파라미터화 정리
인터페이스를 이용한 동작의 파라미터화에서부터 코드를 개선해 메서드 참조까지 발전시켰습니다. 처음에는 인터페이스를 구현한 클래스의 인스턴스를 메서드에 전달해서 코드의 유연성을 높였고, 코드의 장황함을 개선하기 위해 정의와 인스턴스화를 동시에 해주는 익명 클래스를 활용했습니다. 그리고 함수형 인터페이스를 대체할 수 있는 람다 표현식을 이용해 익명 클래스를 대체하고, 람다 표현식을 더 간결하게 바꿔주는 메서드 참조에 대해 알아보았습니다. 이제 스트림에 대한 내용을 마무리하고 다음 포스트에서는 함수형 데이터 처리라는 주제를 다루어보도록 하겠습니다.
'독서 > 모던 자바 인 액션' 카테고리의 다른 글
[자바] 스트림(Stream) 활용 (1) | 2023.10.05 |
---|---|
데이터 컬렉션의 반복 처리 - 스트림(Stream) (1) | 2023.09.26 |
함수형 인터페이스를 통한 람다의 활용 (0) | 2023.09.24 |
간결한 코드를 만드는 법❓- 람다 표현식 (0) | 2023.09.24 |
동작 파라미터화2 (0) | 2023.09.24 |