람다식(Lambda Expression)은 자바 8부터 도입된 기능으로, 함수형 프로그래밍을 구현하기 위한 핵심 요소입니다. 간단히 말하면, 메서드를 하나의 식(expression)으로 표현한 것입니다.
람다식의 가장 큰 특징은 익명 함수(Anonymous Function)라는 점입니다. 메서드의 이름이 없고, 메서드의 매개변수와 실행 코드만으로 구성됩니다. 이를 통해 코드가 간결해지고 가독성이 높아지는 장점이 있습니다.
람다식의 기본 문법은 다음과 같습니다:
Copy(매개변수) -> { 실행 코드 }
예를 들어, 두 수를 더하는 함수를 람다식으로 표현하면 다음과 같습니다:
Copy(int x, int y) -> { return x + y; }
이것을 더 간결하게 표현할 수도 있습니다:
Copy(x, y) -> x + y
위 예제에서 볼 수 있듯이, 람다식은 다음과 같은 요소들을 생략할 수 있습니다:
자바에서 람다식을 사용하기 위해서는 '함수형 인터페이스(Functional Interface)'가 필요합니다. 함수형 인터페이스란 단 하나의 추상 메서드만 가진 인터페이스를 말합니다.
자바에서는 @FunctionalInterface
어노테이션을 통해 함수형 인터페이스임을 명시할 수 있습니다.
Copy@FunctionalInterface
interface Calculator {
int calculate(int x, int y);
}
이제 이 함수형 인터페이스를 이용하여 람다식을 변수에 할당할 수 있습니다.
CopyCalculator add = (x, y) -> x + y;
Calculator subtract = (x, y) -> x - y;
Calculator multiply = (x, y) -> x * y;
Calculator divide = (x, y) -> x / y;
System.out.println(add.calculate(10, 5)); // 출력: 15
System.out.println(subtract.calculate(10, 5)); // 출력: 5
System.out.println(multiply.calculate(10, 5)); // 출력: 50
System.out.println(divide.calculate(10, 5)); // 출력: 2
자바에서는 자주 사용되는 함수형 인터페이스들을 java.util.function
패키지에 미리 정의해두었습니다. 대표적인 함수형 인터페이스는 다음과 같습니다:
void accept(T t)
메서드 제공CopyConsumer<String> printer = message -> System.out.println(message);
printer.accept("Hello, Lambda!"); // 출력: Hello, Lambda!
T get()
메서드 제공CopySupplier<String> messageSupplier = () -> "Hello, Lambda!";
System.out.println(messageSupplier.get()); // 출력: Hello, Lambda!
R apply(T t)
메서드 제공CopyFunction<String, Integer> lengthFunction = str -> str.length();
System.out.println(lengthFunction.apply("Hello")); // 출력: 5
boolean test(T t)
메서드 제공CopyPredicate<String> isEmpty = str -> str.isEmpty();
System.out.println(isEmpty.test("")); // 출력: true
System.out.println(isEmpty.test("Hello")); // 출력: false
람다식을 사용하면 스레드 생성이 매우 간단해집니다.
Copy// 기존 방식
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("스레드 실행 중...");
}
});
// 람다식 사용
Thread thread2 = new Thread(() -> {
System.out.println("람다로 스레드 실행 중...");
});
thread1.start();
thread2.start();
CopyList<String> names = Arrays.asList("김철수", "이영희", "박지민", "최준서");
// 기존 방식
for (String name : names) {
System.out.println(name);
}
// 람다식 사용
names.forEach(name -> System.out.println(name));
// 메서드 참조 사용 (더 간결)
names.forEach(System.out::println);
CopyList<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 짝수만 필터링
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers); // 출력: [2, 4, 6, 8, 10]
람다식은 자바 8에서 도입된 강력한 기능으로, 코드를 더 간결하고 표현력 있게 만들어 줍니다. 특히 함수형 프로그래밍 패러다임을 자바에 도입함으로써 더 유연하고 효율적인 코드 작성이 가능해졌습니다.
적절한 상황에서 람다식을 활용하면 코드의 품질과 가독성을 크게 향상시킬 수 있습니다. 하지만 모든 상황에서 람다식이 최선의 선택은 아니므로, 상황에 맞게 적절히 사용하는 것이 중요합니다.
람다식과 함수형 인터페이스를 잘 이해하고 활용한다면, 더 효율적이고 유지보수하기 쉬운 자바 코드를 작성할 수 있을 것입니다.