[Java] Lambda Expression

김선형·2025년 9월 6일

Java

목록 보기
9/27

개요

람다 표현식은 익명 함수 (Anonymous function)를 작성하는 간결한 방식이다. 메서드 (함수)를 이름 없이 전달하거나, 일급 객체처럼 변수에 저장하거나, 메서드의 인자로 넘길 때 사용한다. 기본 형식은 아래와 같다.

(매개변수) -> { 실행 코드 / 반환값 }

✏️ 일급 객체 (First-Class Citizen)?
다른 객체들에 비해 특별한 제한 없이 동등하게 다뤄질 수 있는 객체를 의미하며, 일반적으로 특정 요소가 다음 세 가지 조건을 만족하면 일급 객체로 간주한다.

  • 객체를 변수에 할당하거나, 배열, 리스트 등의 자료구조에 담을 수 있다.
  • 다른 메서드를 호출할 때 인자로 해당 객체를 넘길 수 있다.
  • 메서드가 실행을 마친 후 결과값으로 해당 객체를 반환할 수 있다.

✏️ 전통적으로 Java에서 객체는 완전한 일급 객체이지만, 메서드 (함수)는 그 자체로 일급 객체가 아니었다. 이후 람다 표현식과 함수형 인터페이스가 도입되면서, 메서드 (함수)도 일급 객체처럼 다룰 수 있게 되었다.

❗️ 람다 표현식은 반드시 함수형 인터페이스 타입에 할당되거나 그 자리에 쓰여야 한다.

함수형 인터페이스 (Functional Interface)

단 하나의 추상 메서드 (abstract method)만을 가지는 인터페이스이다. @Functionalinterface는 함수형 인터페이스임을 명시적으로 나타내는 어노테이션이다.

대표적인 함수형 인터페이스

Runnable

추상 메서드: void run()
매개 변수와 반환값이 없으며, 동시에 실행될 수 있는 작업을 나타내기 위해 설계한다. 일반적으로 별도의 스레드에서 실행될 코드블록으로 구성한다.

() -> System.out.println("Hello")

Supplier<T>

추상 메서드: T get()
값을 반환하지만 매개 변수는 없다.

() -> "Hello"

Consumer<T>

추상 메서드: void accept(T t)
매개 변수가 있지만 반환값은 없다.

s -> System.out.println(s)

Function<T, R>

추상 메서드: R apply(T t)
하나의 인자를 받아서 값을 반환한다.

x -> x.length()

Predicate<T>

추상 메서드: boolean test(T t)
단일 값을 매개 변수로 받아 조건식 (true/false)을 평가한다. 주로 데이터를 필터링하는 데 사용한다.

x -> x.startsWith("A")

Comparator<T>

추상 메서드: int compare(T o1, T o2)
객체 컬렉션의 사용자 정의 정렬 순서를 정하는 데 사용한다. 동일한 타입의 두 객체를 받아 정수를 반환한다.

  • 음수: 첫 번째 객체가 두 번째 객체보다 앞에 온다.
  • 0: 두 객체의 순서가 같다.
  • 양수: 첫 번째 객체가 두 번째 객체보다 뒤에 온다.
(a, b) -> a.length() - b.length()

메서드 참조 (Method Reference)

람다 표현식을 더 간결하게 표현하는 문법이다. 람다에서 단순히 기존 메서드를 호출만 할 경우, 메서드 참조로 치환할 수 있다.

System.out::println // (x) -> System.out.println(x)
Math::random // () -> Math.random()
String::toUpperCase // s -> s.toUpperCase()
String::compareTo // (a, b) -> a.compareTo(b)

유형

  • 정적 메서드 참조: className::staticMethod
  • 특정 객체의 인스턴스 메서드 참조: objectName::instanceMethod
  • 임의 객체의 인스턴스 메서드 참조: className::instanceMethod
  • 생성자 참조: className::new
profile
선형의 비선형적 기록 🐜

0개의 댓글