홈 › 고급 › 06 / 10

메서드 활용 패턴 (고급)

섹션 6진행 0 / 10

메서드 활용 패턴 (고급)

메서드를 값으로 다루는 순간, 상속으로 하던 일의 대부분이 람다 한 줄로 바뀝니다. 메서드 참조 4종, 고차 함수, 커링, 함수 합성, 제네릭 메서드 설계, 전략 주입, 콜백, 지연 실행, 메모이제이션, Stream.iterate, CompletableFuture 체이닝까지 26개 패턴을 모았습니다. 끝내면 Comparator.comparing(...).thenComparing(...), map.computeIfAbsent, future.thenCompose가 왜 그렇게 생겼는지, 그리고 내 코드에 어떻게 같은 구조를 만드는지 알게 됩니다.

1. 왜 배우는가

중급 06 레슨의 템플릿 메서드는 "골격은 부모, 세부는 자식"이었습니다. 단계가 하나뿐이라면 상속까지 필요할까요? Report를 abstract class로 만들고 CsvReport를 상속하는 대신, generate(rows, row -> row + ",")처럼 세부 동작을 인자로 넘기면 클래스가 하나로 줄어듭니다. 이것이 메서드를 값으로 다루는 첫 번째 이유입니다. 상속 계층 없이 동작을 조립합니다.

두 번째 이유는 조합(composition)입니다. 함수는 andThen으로 이어 붙이고, Predicate는 and/or로 합치고, 할인 정책은 then/orCheaper로 겹칩니다. if-else로 조합을 나열하면 정책이 하나 늘 때마다 분기가 배로 늘지만, 함수 조합은 새 정책을 한 줄 추가하면 끝입니다.

Comparator.comparing(...).thenComparing(...)이 바로 이 원리입니다.

세 번째는 횡단 관심사입니다. 재시도, 캐시, 시간 측정, 로깅은 어떤 메서드에든 붙을 수 있습니다. 메서드마다 복사해 넣는 대신 retry(3, action), cached(loader)처럼 함수를 받아 함수를 돌려주는 데코레이터로 만들면 한 번 작성해서 어디든 감쌉니다. 스프링 AOP가 프록시로 하는 일을, 이 레슨에서는 고차 함수로 직접 만들어 봅니다.