람다식(Lambda Expression)은 Java 8부터 도입된 함수형 프로그래밍 기능으로, 코드의 간결성과 가독성을 높이기 위한 문법입니다. 람다식은 익명 함수를 생성하는 방식으로, 기존 익명 클래스를 대체하거나 간단한 기능을 효율적으로 구현하는 데 사용됩니다
람다식은 매개변수, 화살표(->), 그리고 실행될 코드 블록으로 구성됩니다.
(parameters) -> { expression or block of code }
(int x, int y) -> x + y // 두 숫자의 합을 반환
() -> System.out.println("Hello, Lambda!") // 인자가 없는 경우
(String s) -> s.toUpperCase() // 문자열을 대문자로 변환
요소 | 설명 |
매개변수 | 메서드에 전달할 입력 값. 매개변수가 하나일 경우 괄호 생략 가능. 예: s -> s.length() |
화살표(->) | 매개변수와 실행될 코드를 구분. |
코드 블록 | 실행할 코드 또는 반환 값을 정의. 단일 표현식일 경우 중괄호 생략 가능. 여러 줄일 경우 {} 사용. |
람다식은 주로 **함수형 인터페이스(Functional Interface)**에서 사용됩니다. 함수형 인터페이스는 하나의 추상 메서드만 가지는 인터페이스입니다.
인터페이스 | 추상 메서드 | 설명 및 사용 예제 |
Runnable | void run() | 별도의 반환 값 없이 작업을 실행. |
Consumer<T> | void accept(T t) | 입력만 받고 반환 값이 없는 연산을 수행. |
Supplier<T> | T get() | 입력 없이 값을 반환. |
Function<T, R> | R apply(T t) | 입력 값을 변환하여 다른 타입의 값을 반환. |
Predicate<T> | boolean test(T t) | 입력 값에 대해 논리적인 테스트를 수행하고 결과를 반환. |
Runnable r = () -> System.out.println("Lambda Runnable 실행!");
r.run();
Consumer<String> printer = s -> System.out.println(s);
printer.accept("람다식으로 출력!");
Function<Integer, String> converter = num -> "숫자: " + num;
System.out.println(converter.apply(10)); // 출력: 숫자: 10
람다식은 컬렉션과 스트림 API에서 매우 유용합니다.
List<String> names = Arrays.asList("Java", "Spring", "Hibernate");
names.forEach(name -> System.out.println(name));
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
.filter(n -> n % 2 == 0) // 짝수만 필터링
.forEach(System.out::println); // 출력: 2, 4
List<String> names = Arrays.asList("java", "spring", "hibernate");
names.stream()
.map(String::toUpperCase) // 대문자로 변환
.forEach(System.out::println);
코드 간결성: 익명 클래스와 비교하여 코드가 짧아지고 가독성이 향상됩니다.
지연 실행: 스트림 API와 함께 사용할 때 연산이 필요할 때까지 실행을 미룰 수 있습니다.
병렬 처리: 스트림 API와 함께 병렬 작업을 쉽게 구현할 수 있습니다.
디버깅 어려움: 익명 클래스에 비해 오류 발생 시 디버깅이 어려울 수 있습니다.
복잡성 증가: 지나치게 복잡한 람다식을 사용하면 가독성이 오히려 떨어질 수 있습니다.
기능 제한: 함수형 인터페이스에 의존하기 때문에 다중 메서드를 포함한 로직 구현에는 부적합합니다.
람다식의 단순화를 위해 메서드 참조를 사용할 수 있습니다.
Function<Integer, String> converter = String::valueOf;
System.out.println(converter.apply(42)); // 출력: "42"
List<String> names = Arrays.asList("Java", "Spring", "Hibernate");
names.forEach(System.out::println); // 메서드 참조로 출력
Supplier<List<String>> listSupplier = ArrayList::new;
List<String> list = listSupplier.get();
람다식은 Java 프로그래밍에서 필수적으로 이해해야 할 중요한 개념입니다. 특히, 스트림 API와 함께 사용하면 더욱 강력한 기능을 발휘합니다. 이 글이 람다식의 이해와 실무 활용에 도움이 되기를 바랍니다