본문 바로가기
독서/모던 자바 인 액션

간결한 코드를 만드는 법❓- 람다 표현식

by kriorsen 2023. 9. 24.

💡람다 표현식이란?

익명 함수를 단순화하여 파라미터 리스트, 바디, 반환 형식을 가지는 표현식

 

간결한 코드를 위한 람다 활용


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);

위와 같이 간결하게 수정할 수 있습니다. 이번 장에서는 간단하게 람다의 구조와 함수형 인터페이스에 대해 알아봤는데, 다음 장에서는 람다를 활용하는 다양한 예시들을 살펴보도록 하겠습니다.