[Java] 람다 표현식과 메서드 참조

🔥Log·2023년 2월 13일
1

Java

목록 보기
9/22

🧐 람다 표현식?


람다 표현식은 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));

위에서 얘기한 정렬 코드는 이렇게 람다 표현식으로 대체할 수 있다.

익명 내부 클래스를 람다 표현식으로 바꿔주면서, 가독성이 매우 올라간 것을 코드만 봐도 바로 느낄 수 있다.

그런데, 이 코드를 보면, 람다 표현식 안에서 오직 하나의 메서드만이 호출되고 있는데, 이러한 경우에는 "메서드 참조" 문법을 사용할 수 있다.


메서드 참조 (Method Reference)

바~로 메서드 참조 문법을 적용해보자.

books.sort(Book::compareByPage);

최종적으로 Sorting하는 코드를 이렇게 메서드 참조 문법을 적용하여 아주 간결하게 표현해줄 수 있게 된다.


☕ 참고


0개의 댓글