Home > Java > Java > ☕️[Java] 람다(Lambda)

☕️[Java] 람다(Lambda)
Java Programming Language Backend

☕️[Java] 람다(Lambda).

1️⃣ 람다 표현식(Lambda Expression)

  • Java 8에서 도입된 기능으로, 익명 함수(Anonymous Function)를 간결하게 표현한 것입니다.
  • 람다 표현식은 메서드로 전달되거나, 변수에 할당될 수 있는 짧은 형태의 코드를 작성할 수 있게 해줍니다.
  • 주로 함수형 인터페이스(Functional Interface)를 구현하는 데 사용되며, Java에서 함수형 프로그래밍 스타일을 가능하게 합니다.

2️⃣ 람다 표현식의 기본 구조.

  • 람다 표현식은 다음과 같은 형태로 작성됩니다.
(parameters) -> expression

혹은

(paramters) -> { statements; }
  • 매개변수 목록(parameters)
    • 메서드처럼 전달받을 인자를 정의합니다.
    • 인자가 하나인 경우 괄호()를 생략 할 수 있습니다.
  • 화살표 연산자 ->
    • 람다 표현식의 매개변수와 본문(body)을 구분합니다.
  • 본문(body)
    • 람다가 실행할 코드를 정의합니다.
    • 단일 표현식일 경우 중괄호{}를 생략할 수 있으며, 여러 문장일 경우 중괄호 {}로 묶습니다.

3️⃣ 예시

  • 1. 기본적인 람다 표현식
// 기존 익명 내부 클래스 방식
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, Lambda!");
    }
};

// 람다 표현식 사용
Runnable lambdaRunnable = () -> System.out.prinln("Hello, Lambda!");
  • 위 코드에서 Runnable 인터페이스를 구현하는 익명 내부 클래스를 람다 표현식으로 대체했습니다.
  • Runnable은 매개변수가 없고 반환값도 없는 run() 메서드를 가지고 있기 때문에, 이를 간단하게 () ->로 표현할 수 있습니다.

  • 2. 매개변수와 함께 사용하는 람다 표현식
// 기존 방식
Comparator<Integer> comparator = new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
    }
}

// 람다 표현식 사용
Comparator<Integer> lambdaComparator = (o1, o2) -> o1.compareTo(o2);
  • 위 코드에서 Comparator 인터페이스를 구현하는 익명 내부 클래스를 람다 표현식으로 대체했습니다.
  • 두 개의 매개변수 o1o2를 비교하는 코드를 람다 표현식으로 간결하게 작성할 수 있습니다.

4️⃣ 함수형 인터페이스와 람다.

  • 람다 표현식은 함수형 인터페이스를 구현하는 데 사용됩니다.
  • 함수형 인터페이스는 단 하나의 추상 메서드만을 가지는 인터페이스로, @FuncationalInterface 애노테이션으로 명시할 수 있습니다.

예시: 함수형 인터페이스

@FunctionalInterface
interface MyFuncationalInterface {
    void doSomething();
}

public class Main {
    public static void main(String[] args) {
        MyFunctionalInterface myFunc = () -> System.out.println("Doing something!");
        myFunc.doSomething(); // 출력: Doing something!
    }
}
  • 위 코드에서 MyFunctionalInterface는 함수형 인터페이스이며, 람다 표현식 () -> System.out.println("Doing something!") 은 이 인터페이스의 doSomething() 메서드를 구현합니다.

5️⃣ 자주 사용되는 함수형 인터페이스

  • Java 8에서는 자주 사용되는 함수형 인터페이스들이 java.util.function 패키지에 포함되어 있습니다.
    • Predicate<T> : T 타입의 인자를 받아서 boolean을 반환하는 함수입니다.
        Predicate<String> isEmpty = s -> s.isEmpty();
      
    • Function<T, R> : T 타입의 인자를 받아 R 타입의 결과를 반환하는 함수입니다.
        Function<Integer, String> intToString = i -> Integer.toString(i);
      
    • Consumer<T> : T 타입의 인자를 받아서 소비하는(반환값이 없는) 함수입니다.
        Consumer<String> print = s -> System.out.println(s);
      
    • Supplier<T> : 인자를 받지 않고 T 타입의 결과를 반환하는 함수입니다.
        Supplier<Double> randomValue = () -> Math.random();
      

6️⃣ 장점.

  • 1. 코드 간결화 : 람다 표현식을 사용하면 코드가 훨씬 간결해지고 가독성이 좋아집니다.
  • 2. 지연 실행 : 람다 표현식을 통해 코드를 지연 실행할 수 있어 성능 최적화에 유리합니다.
  • 3. 병렬 처리 : 스트림 API와 함께 사용하여 병렬 처리 작업을 쉽게 구현할 수 있습니다.

7️⃣ 요약.

  • 람다 표현식은 익명 함수의 일종으로, 함수형 인터페이스를 구현하는 간결한 방법을 제공합니다.
    • 이를 통해 코드의 가독성과 유지보수성이 향상되며, 함수형 프로그래밍 패러다임을 Java에서 더욱 효과적으로 활용할 수 있게 됩니다.