Back_End/JAVA

자바의 람다식(Lambda Expression)

10Biliion 2025. 2. 12. 17:20

 

 

1. 람다식(Lambda Expression)란?

람다식은 익명 함수(Anonymous Function) 를 생성하기 위한 식으로, 자바 8부터 도입되었습니다. 람다식을 사용하면 코드가 간결해지고 가독성이 좋아지며, 컬렉션 및 스트림 API와 함께 활용할 때 더욱 유용합니다.

기존의 익명 클래스를 사용하는 방식보다 코드가 훨씬 간결해지며, 함수형 인터페이스(Functional Interface)와 함께 사용됩니다.


2. 람다식 기본 문법

(매개변수) -> { 실행 코드 }

람다식에서 매개변수 타입은 생략 가능하며, 코드 블록이 한 줄이라면 중괄호 {} 생략이 가능합니다.

람다식 기본 사용법

// 기존 익명 클래스 방식
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, Lambda!");
    }
};

// 람다식 사용
Runnable r2 = () -> System.out.println("Hello, Lambda!");

r1.run();
r2.run();

3. 함수형 인터페이스와 람다식

람다식은 함수형 인터페이스(Functional Interface) 와 함께 사용됩니다. 함수형 인터페이스는 하나의 추상 메서드만 가지는 인터페이스를 의미하며, @FunctionalInterface 어노테이션을 사용할 수 있습니다.

함수형 인터페이스와 람다식

@FunctionalInterface
interface MyFunction {
    int calculate(int a, int b);
}

public class LambdaExample {
    public static void main(String[] args) {
        // 람다식 사용
        MyFunction add = (a, b) -> a + b;
        MyFunction multiply = (a, b) -> a * b;

        System.out.println("덧셈: " + add.calculate(5, 3));   // 8
        System.out.println("곱셈: " + multiply.calculate(5, 3)); // 15
    }
}

4. 자바에서 제공하는 함수형 인터페이스

자바 8부터는 java.util.function 패키지에서 기본적인 함수형 인터페이스를 제공하며, 이를 활용하면 별도의 인터페이스를 만들 필요 없이 간단하게 람다식을 사용할 수 있습니다.

함수형 인터페이스 메서드 시그니처 설명
Supplier<T> T get() 매개변수 없이 결과 반환
Consumer<T> void accept(T t) 매개변수를 받아 사용하지만 반환값 없음
Function<T, R> R apply(T t) 매개변수를 받아서 변환 후 반환
Predicate<T> boolean test(T t) 조건을 검사하여 true/false 반환
BiFunction<T, U, R> R apply(T t, U u) 두 개의 입력을 받아 하나의 결과 반환

Function과 Predicate 사용하기

import java.util.function.Function;
import java.util.function.Predicate;

public class LambdaExample2 {
    public static void main(String[] args) {
        // Function: 입력 값을 받아 변환 후 반환
        Function<String, Integer> stringLength = str -> str.length();
        System.out.println("길이: " + stringLength.apply("Lambda")); // 6

        // Predicate: 조건 검사 후 boolean 반환
        Predicate<Integer> isEven = num -> num % 2 == 0;
        System.out.println("짝수인가? " + isEven.test(10)); // true
    }
}

5. 컬렉션과 스트림 API에서 람다식 활용

람다식은 자바의 컬렉션과 스트림 API에서 강력한 기능을 발휘합니다.

List에서 forEach와 filter 사용하기

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class LambdaExample3 {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

        // forEach 사용
        names.forEach(name -> System.out.println(name));

        // filter와 collect 사용
        List<String> filteredNames = names.stream()
                .filter(name -> name.startsWith("A"))
                .collect(Collectors.toList());

        System.out.println("A로 시작하는 이름: " + filteredNames);
    }
}

6. 메서드 참조(Method Reference)

람다식은 메서드 참조 방식으로 더욱 간결하게 표현할 수도 있습니다.

메서드 참조 사용하기

import java.util.Arrays;
import java.util.List;

public class MethodReferenceExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

        // 기존 람다식
        names.forEach(name -> System.out.println(name));

        // 메서드 참조 사용
        names.forEach(System.out::println);
    }
}

 

 

자바의 람다식은 코드의 가독성을 높이고 간결하게 작성할 수 있도록 도와줍니다. 특히 함수형 인터페이스와 함께 사용하면 코드의 유지보수성이 향상됩니다. 또한 스트림 API와 결합하면 컬렉션을 더욱 효과적으로 다룰 수 있습니다.

람다식 활용 시 유의할 점:

  • 하나의 추상 메서드만 있는 함수형 인터페이스에서만 사용 가능
  • 코드가 지나치게 복잡해지지 않도록 주의 (간결함을 유지하는 것이 중요)
  • 메서드 참조를 활용하면 더욱 가독성이 좋아질 수 있음