홈 › 고급 › 03 / 10

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

섹션 7진행 0 / 10

람다(Lambda)와 함수형 인터페이스 — 동작을 값으로 다루기

람다가 익명 클래스와 어떻게 다른지(컴파일 방식, this, 캡처 규칙), java.util.function 표준 인터페이스를 언제 골라 쓰는지, 메서드 참조 4종과 함수 합성을 이해하고, 전략 교체·검증 체인·Comparator 체인 같은 실무 패턴을 람다로 작성할 수 있게 됩니다.

1. 왜 배우는가

JDK 8 이후 자바 코드의 절반은 람다입니다.

list.sort(comparing(Order::amount)), map.computeIfAbsent(k, key -> new ArrayList<>()), executor.submit(() -> fetch(id)), stream().filter(o -> o.paid()).

스트림, 컬렉션 API, 동시성, 스프링(RestTemplate 콜백, @Transactional 템플릿, WebFlux) 어디를 봐도 람다가 인자로 들어갑니다.

람다를 "짧은 익명 클래스"로만 이해하면 effectively final 컴파일 에러나 this 가 엉뚱한 객체를 가리키는 문제에서 막힙니다.

람다의 본질은 동작(behavior)을 값처럼 전달하는 것입니다. 자바에서 값은 객체나 기본형뿐이라, 예전에는 "정렬 기준"이나 "필터 조건" 같은 동작을 넘기려면 인터페이스를 구현한 객체를 만들어야 했습니다. 람다는 그 절차를 문법 수준에서 압축하고, 컴파일러가 invokedynamic 으로 객체 생성 비용까지 최적화합니다.

함수형 사고는 설계에도 영향을 줍니다. "결제 수단별 수수료 계산"을 if-else 사다리 대신 Map<PaymentType, Function<Long, Long>> 으로 표현하면 새 결제 수단 추가가 한 줄이 됩니다. 검증 규칙을 Predicate<Order> 리스트로 두면 규칙의 추가·제거·조합이 데이터 조작이 됩니다. 이 레슨은 그 사고방식의 기초를 원리와 함께 다룹니다.