💡람다 표현식이란?
익명 함수를 단순화하여 파라미터 리스트, 바디, 반환 형식을 가지는 표현식
간결한 코드를 위한 람다 활용
2.1 람다의 구조
// 익명 클래스의 한계
List<Book> scienceBooks = filterBooks(bookshelf, new BookThickPredicate() {
public boolean test(Book book) {
return Science.equals(book.getCategory());
}
});
익명 클래스의 한계로, 지난 장에서 개선된 코드조차 가독성이 떨어지는 문제가 발생했습니다. 그러나 람다를 활용하면 놀랍게도 코드의 의미를 해치지 않는 선에서 간결성을 더할 수 있습니다.
(Book book1, Book book2) -> book1.getPage().compareTo(book2.getPage());
위 코드는 람다 표현식의 예시입니다. book1, book2와 같은 파라미터를 가지며 화살표로 파라미터들과 람다의 바디를 구분하고 있습니다. 그리고 람다의 바디에서는 해당 표현식의 반환값을 나타내고 있습니다. 코드를 해석해 보면 이 표현식은 두 개의 Book 인스턴스를 전달받아서 book1과 book2의 페이지 비교 연산 결과를 반환해 주는 역할을 합니다.
이 구조를 바탕으로 다양한 람다 표현식을 작성할 수 있습니다.
(Book book) -> Science.equals(book.getCategory()) // Book을 인자로 받고 불리언 값을 반환
(int x, int y) -> { // 두 개의 숫자를 전달받아서 연산 결과 출력
System.out.println(x + y);
System.out.println(Math.max(x, y));
}
() -> "Hello world!" // 매개변수 없이 문자열 반환
(int a) -> Math.abs(a) // a의 절대값을 반환
(parameteres) -> expression
는 표현식 스타일로 expression에 반환값을 담으면 되고, (parameters) -> { statements; }
형식의 경우에는 블록 스타일로 여러 행의 문장을 포함할 수 있다.
2.2 람다를 사용할 수 있는 곳 - 함수형 인터페이스
람다 표현식을 이용해 익명 함수를 단순화할 수 있게 되었는데, 이 람다는 어떤 문맥에서 사용할 수 있는 것일까요? 바로 함수형 인터페이스의 인스턴스를 대체할 때 활용할 수 있습니다. 우선 함수형 인터페이스가 무엇인지 더 자세히 살펴보도록 하겠습니다.
public interface BookPredicate {
boolean test(Book book); // boolean 값을 반환하는 메서드
}
지난 장에서 언급된 Predicate 인터페이스가 함수형 인터페이스에 해당됩니다. 함수형 인터페이스는 정확히 하나의 추상 메서드를 지정하는 인터페이스를 의미합니다. 자바 API의 Comparator, Runnable, Callable와 같은 인터페이스들도 이에 해당됩니다.
💡 함수형 인터페이스란?
정확히 하나의 추상 메서드를 지정하는 인터페이스로, 기본 구현을 제공하는 바디를 포함한 디폴트 메서드를 가질 수 있다.
이 함수형 인터페이스를 활용하면
List<Book> scienceBooks = filterBooks(bookshelf, new BookPredicate() {
public boolean test(Book book) {
return Science.equals(book.getCategory());
}
});
이렇게 장황했던 기존 코드를
List<Book> scienceBooks = filterBooks(bookshelf, (Book book) -> book.getPage() >= 500);
위와 같이 간결하게 수정할 수 있습니다. 이번 장에서는 간단하게 람다의 구조와 함수형 인터페이스에 대해 알아봤는데, 다음 장에서는 람다를 활용하는 다양한 예시들을 살펴보도록 하겠습니다.
'독서 > 모던 자바 인 액션' 카테고리의 다른 글
데이터 컬렉션의 반복 처리 - 스트림(Stream) (1) | 2023.09.26 |
---|---|
람다 표현식을 더 간결하게 - 메서드 참조 (0) | 2023.09.25 |
함수형 인터페이스를 통한 람다의 활용 (0) | 2023.09.24 |
동작 파라미터화2 (0) | 2023.09.24 |
동작 파라미터화1 (0) | 2023.09.24 |