본문으로 건너뛰기
Advertisement

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)은 자바 개발 생산성을 획기적으로 끌어올린 가장 중요한 현대 자바의 특징입니다.

Advertisement