람다 표현식은 Java8에서 처음 등장한 문법이다.
Java8 이전에는 익명 내부 클래스로 표현하던 것들을 가독성 좋게 표현할 수 있게 해주는 녀석이다.
참고로, Javascript 진영에는 화살표 함수, 콜백함수, 익명함수같은 Java의 람다 표현식과 아주 유사한 문법들이 있다.
람다 표현식을 쉽게 찾아볼 수 있는 예시 중에 하나는 아마 Sorting이지 않을까 싶다.
지금부터 예시를 한번 들어보도록 하겠다.
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class Book {
private int page;
private String name;
public String getInfo() {
return this.name + " (p." + this.page + ")";
}
public static int compareByPage(Book book1, Book book2) {
return book1.page - book2.page;
}
}
먼저, 이런 Book
이라는 클래스가 있다고 가정해보자.
Book
클래스는 그 책의 페이지와 이름에 대한 정보를 갖고 있다.
그리고, page를 비교할 수 있는 static 메서드 하나와 책의 정보를 출력할 수 있는 메서드 하나를 갖고 있다.
이 Book
클래스로 정렬하는 기능이 포함된 예제 코드를 만들어보겠다.
public class JavaApplication {
public static void main(String[] args) {
/* 책의 배열 만들기 */
List<Book> books = new ArrayList<>();
books.add(new Book(100, "개미"));
books.add(new Book(10, "돈키호테"));
books.add(new Book(200, "뇌"));
books.add(new Book(45, "토비의 스프링"));
books.add(new Book(13, "코스모스"));
books.add(new Book(88, "삼국지"));
/* 배열을 출력하기 */
System.out.println("=== Soring 전 ===");
for (Book book : books) {
System.out.println("book = " + book.getInfo());
}
/* 페이지 순으로 정렬하기 */
books.sort(new Comparator<Book>() {
@Override
public int compare(Book o1, Book o2) {
return Book.compareByPage(o1, o2);
}
});
/* 정렬 후, 배열을 출력하기 */
System.out.println("=== Soring 후 ===");
for (Book book : books) {
System.out.println("book = " + book.getInfo());
}
}
}
6개의 Book
인스턴스를 생성하고, 순서대로 출력하는 간단한 코드이다.
이 코드를 실행하면 아래와 같은 결과를 얻을 수 있을 것이다.
여기까지는 인트로이고, 이제부터가 본론인데, 주목할 부분은 Sorting을 하는 부분의 코드이다.
books.sort(new Comparator<Book>() {
@Override
public int compare(Book o1, Book o2) {
return Book.compareByPage(o1, o2);
}
});
Java8 이전에 Soring을 하려면, 이렇게 익명 클래스를 .sort()
메서드 내부에 생성해주면 됐었는데, Java8부터는 이를 람다로 표현할 수 있다.
books.sort((a, b) => {
return Book.compareByPage(o1, o2);
});
// 또는
books.sort((a, b) => Book.compareByPage(o1, o2));
위에서 얘기한 정렬 코드는 이렇게 람다 표현식으로 대체할 수 있다.
익명 내부 클래스를 람다 표현식으로 바꿔주면서, 가독성이 매우 올라간 것을 코드만 봐도 바로 느낄 수 있다.
그런데, 이 코드를 보면, 람다 표현식 안에서 오직 하나의 메서드만이 호출되고 있는데, 이러한 경우에는 "메서드 참조" 문법을 사용할 수 있다.
바~로 메서드 참조 문법을 적용해보자.
books.sort(Book::compareByPage);
최종적으로 Sorting하는 코드를 이렇게 메서드 참조 문법을 적용하여 아주 간결하게 표현해줄 수 있게 된다.