ch13_람다와함수형

통합 문서입니다.


1. 람다와 함수형 프로그래밍

람다와 함수형 프로그래밍

학습 목표


1. 람다의 본질

람다는 익명 함수 문법이지만, Java에서는 결국 함수형 인터페이스 구현체다.

Comparator<String> cmp = (a, b) -> a.length() - b.length();

핵심:

람다 함수형 흐름


2. 함수형 인터페이스

추상 메소드가 정확히 하나인 인터페이스.

@FunctionalInterface
interface Calculator {
    int calc(int a, int b);
}

람다식은 해당 추상 메소드 구현으로 매핑된다.


3. 표준 함수형 인터페이스

  1. Predicate<T>: T -> boolean
  2. Function<T, R>: T -> R
  3. Consumer<T>: T 소비, 반환 없음
  4. Supplier<T>: 입력 없이 T 제공
  5. UnaryOperator<T>, BinaryOperator<T>: Function 특수형

예:

Predicate<String> notBlank = s -> s != null && !s.isBlank();
Function<String, Integer> length = String::length;
Consumer<String> out = System.out::println;
Supplier<UUID> uuid = UUID::randomUUID;

4. 람다 문법 포인트

(파라미터) -> 표현식
(파라미터) -> { 문장; return ; }

규칙:


5. 메소드 참조

람다를 더 간결하게 표현하는 문법.

종류:

  1. ClassName::staticMethod
  2. instance::instanceMethod
  3. ClassName::instanceMethod
  4. ClassName::new (생성자 참조)

6. 함수 조합(Composition)

Function은 조합 메소드를 제공한다.

Function<String, String> trim = String::trim;
Function<String, String> lower = String::toLowerCase;
Function<String, String> normalize = trim.andThen(lower);

작은 함수들을 조합하면 재사용성과 테스트 용이성이 높아진다.


7. 부작용과 불변성

함수형 스타일 핵심은 “부작용 최소화”다.

지양:

권장:


8. 람다와 예외 처리

표준 함수형 인터페이스는 checked 예외를 직접 던지기 어렵다.

대안:

  1. 람다 내부 try-catch
  2. 예외 래핑 유틸 함수
  3. checked를 runtime으로 의미 있게 변환

9. 디버깅/가독성 전략

  1. 람다 본문이 길어지면 별도 메소드로 분리
  2. 의미 있는 변수명으로 중간 단계 분리
  3. 메소드 참조 남용 금지(오히려 이해 어려운 경우 존재)

10. 실무 패턴

  1. 유효성 검사 파이프라인
  2. 정책(할인/필터) 주입
  3. 이벤트 핸들러 등록
  4. Stream 연산 함수 전달

11. 정리


2. 문제

문제

ch13 범위(람다, 함수형 인터페이스, 메소드 참조, 함수 조합) 문제입니다.


A. 람다 기초

  1. Calculator 함수형 인터페이스를 만들고 덧셈 람다를 구현하시오.
  2. 같은 인터페이스로 뺄셈/곱셈/나눗셈 람다를 구현하시오.
  3. 익명 클래스 구현과 람다 구현을 비교하시오.

B. 표준 함수형 인터페이스

  1. Predicate<String>로 빈 문자열 필터를 구현하시오.
  2. Function<String, Integer>로 문자열 길이 변환을 구현하시오.
  3. Consumer<String>로 로그 출력 함수를 작성하시오.
  4. Supplier<UUID>로 랜덤 ID를 생성하시오.

C. 메소드 참조

  1. s -> s.length()String::length로 바꾸시오.
  2. x -> System.out.println(x)를 메소드 참조로 바꾸시오.
  3. 생성자 참조(User::new)를 사용해 객체 리스트를 생성하시오.

D. 함수 조합

  1. trim -> lowercase -> prefix 추가 함수를 조합하시오.
  2. Predicateand, or, negate를 활용해 복합 조건 필터를 작성하시오.
  3. 리스트 전처리 파이프라인을 함수 조합으로 구성하시오.

E. 실무 시나리오

  1. 할인 정책 인터페이스를 함수형으로 설계하고 런타임에 교체하시오.
  2. 입력 검증 정책을 람다 리스트로 구성해 순차 적용하시오.
  3. 이벤트 콜백 구조를 람다로 단순화하시오.

F. 챌린지

  1. 체크 예외를 다루는 람다 래퍼 유틸을 구현하시오.
  2. 부작용이 있는 람다와 없는 람다를 비교하고 테스트 코드를 작성하시오.
  3. Stream 파이프라인과 결합해 람다 중심 데이터 처리 코드를 작성하시오.

제출 체크리스트

  1. 람다 본문이 지나치게 길지 않은가?
  2. 함수형 인터페이스 선택이 목적과 맞는가?
  3. 메소드 참조가 오히려 가독성을 해치지 않는가?
  4. 외부 가변 상태를 불필요하게 변경하지 않았는가?