람다 표현식

람다 표현식 (Lambda Expressions)

자바 8에서 도입된 람다 표현식은 코드를 훨씬 간결하게 만들어 줘요. 이름 없는 함수를 값처럼 다룰 수 있게 되면서, 콜백이나 동작 전달을 표현하는 문법이 크게 짧아졌죠. dev.java의 람다 시리즈는 처음 람다를 쓰는 방법부터 실제 애플리케이션에서 유용한 함수형 인터페이스, 메서드 참조, 비교자(Comparator) 조합까지 단계적으로 가르쳐 줘요.

출처: Lambda Expressions — Dev.java

첫 람다 표현식

람다는 매개변수 목록, 화살표(->), 본문으로 이루어져요. 단순히 어떤 동작을 표현하고 싶을 때 익명 클래스를 대신할 수 있죠. 람다를 이해하는 첫 관문은 '이 람다의 타입이 무엇인가'를 파악하는 일이에요. 람다는 그 자체로 타입이 없고, 자리에서 요구하는 함수형 인터페이스로 추론되어요.

// 익명 클래스로 정렬 기준 전달
Collections.sort(words, new Comparator<String>() {
    public int compare(String a, String b) {
        return a.length() - b.length();
    }
});

// 람다로 같은 일을 표현
Collections.sort(words, (a, b) -> a.length() - b.length());

자주 쓰는 함수형 인터페이스

JDK에는 람다를 받아들이는 유용한 함수형 인터페이스들이 준비돼 있어요. 대표적으로 입력을 하나 받아 결과를 돌려주는 Function, 조건 판단에 쓰는 Predicate, 값을 소비하는 Consumer, 인자를 받아 값을 만들어내는 Supplier 같은 것들이죠. java.util.function 패키지에 모여 있으니, 애플리케이션에서 동작을 전달할 때 이들부터 떠올리면 좋아요.

메서드 참조 (Method References)

이미 정의된 메서드를 람다로 전달하고 싶다면 메서드 참조 문법(클래스::메서드)을 쓸 수 있어요. 람다 본문이 단순히 기존 메서드를 호출할 뿐이라면 메서드 참조로 더 읽기 좋게 줄일 수 있죠. 예를 들어 s -> s.toUpperCase()String::toUpperCase로 표현할 수 있어요.

비교자 조합과 기본·정적 메서드

람다를 조합해 더 큰 동작을 만들 수도 있어요. 인터페이스의 기본(default) 메서드와 정적(static) 메서드를 활용해 람다를 합성하고, Comparator의 체이닝 메서드로 다중 정렬 기준(예: 길이순 → 사전순)을 한 번에 정의할 수 있답니다. 이 시리즈는 마지막에 비교자를 만들고 조합하는 실무적인 예시로 마무리돼요.

더 알아보기