12.3 람다식과 함수형 인터페이스 (Lambda & Functional Interface)
Java 8에서 도입된 람다식(Lambda Expression) 은 자바를 훨씬 더 간결하고 현대적으로 만들어준 혁신적인 기능입니다. "이름이 없는 함수(익명 함수)"를 마치 데이터처럼 다루는 것이 가능해졌습니다.
1. 함수형 인터페이스란?
람다식을 사용하려면 함수형 인터페이스(Functional Interface) 가 필요합니다. 함수형 인터페이스란 추상 메서드가 딱 하나만 있는 인터페이스입니다. @FunctionalInterface 어노테이션으로 표시합니다.
@FunctionalInterface
public interface Calculator {
int calculate(int a, int b); // 추상 메서드 1개만 있어야 함
}
2. 람다식 문법
// 기존 방식 (익명 클래스 구현)
Calculator add = new Calculator() {
@Override
public int calculate(int a, int b) {
return a + b;
}
};
// 람다식으로 단축 (훨씬 간결!)
Calculator add = (a, b) -> a + b;
System.out.println(add.calculate(10, 20)); // 30
람다 문법 규칙:
(매개변수) -> 반환식형태- 매개변수가 1개면 괄호 생략 가능:
x -> x * 2 - 블록이 필요하면 중괄호 사용:
(a, b) -> { ... return result; }
3. 자바가 제공하는 표준 함수형 인터페이스
자바는 java.util.function 패키지에 자주 쓰이는 함수형 인터페이스를 미리 정의해두었습니다.
| 인터페이스 | 메서드 | 설명 |
|---|---|---|
Predicate<T> | boolean test(T t) | T를 받아 boolean 반환 (조건 판별) |
Function<T,R> | R apply(T t) | T를 받아 R로 변환 |
Consumer<T> | void accept(T t) | T를 받아 소비 (반환값 없음) |
Supplier<T> | T get() | 아무것도 받지 않고 T를 공급 |
import java.util.function.*;
// Predicate: 짝수 여부 판별
Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4)); // true
System.out.println(isEven.test(7)); // false
// Function: 문자열의 길이 반환
Function<String, Integer> getLength = s -> s.length();
System.out.println(getLength.apply("Hello")); // 5
// Consumer: 출력만 하는 함수
Consumer<String> printer = s -> System.out.println(">> " + s);
printer.accept("Java Lambda"); // >> Java Lambda
// Supplier: 값을 공급
Supplier<String> greeting = () -> "Hello, World!";
System.out.println(greeting.get()); // Hello, World!
4. 람다와 컬렉션의 만남: 스트림 맛보기
람다식은 컬렉션의 forEach(), removeIf() 같은 메서드와 함께 쓸 때 더욱 강력해집니다.
import java.util.ArrayList;
ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// 모든 요소 출력 (람다 방식)
names.forEach(name -> System.out.println("이름: " + name));
// 길이가 4 이하인 이름 제거
names.removeIf(name -> name.length() <= 3);
System.out.println(names); // [Alice, Charlie]
람다식과 스트림(Stream)은 자바 개발 생산성을 획기적으로 끌어올린 가장 중요한 현대 자바의 특징입니다.