컨티뉴에이션(Continuation)은 프로그램의 나머지 계산 전체를 하나의 값으로 표현하는 개념이다. "현재 실행 지점 이후에 무엇을 해야 하는가"를 객체화한 것으로, 코루틴, 비동기 프로그래밍, 예외 처리의 이론적 기반이다.
CPS (Continuation-Passing Style)
일반 스타일 vs CPS:
javascript
// 일반 스타일
function add(x, y) {
return x + y;
}
const result = add(3, 4); // 7
// CPS: 결과를 반환하지 않고 컨티뉴에이션에 전달
function addCPS(x, y, cont) {
cont(x + y);
}
addCPS(3, 4, result => console.log(result)); // 7
javascript
// CPS 체이닝 (비동기와 유사)
function factorialCPS(n, cont) {
if (n === 0) return cont(1);
factorialCPS(n - 1, result => cont(n * result));
}
factorialCPS(5, result => console.log(result)); // 120
call/cc (call-with-current-continuation)
Scheme의 call/cc는 현재 컨티뉴에이션을 캡처한다:
scheme
;; Scheme
(define result
(call-with-current-continuation
(lambda (k)
(k 42) ; 컨티뉴에이션 호출 → 나머지 계산 무시
(+ 1 2) ; 실행되지 않음
)))
;; result = 42
;; 조기 탈출 (break/return 시뮬레이션)
(define (find-first pred lst)
(call/cc
(lambda (return)
(for-each (lambda (x)
(when (pred x) (return x)))
lst)
#f)))
컨티뉴에이션과 현대 언어 기능
| 기능 | 컨티뉴에이션 관계 |
|---|
| 코루틴 | 재진입 가능한 컨티뉴에이션 |
| async/await | 단방향 컨티뉴에이션 변환 |
| 예외 처리 | 탈출 컨티뉴에이션 |
| 제너레이터 | yield로 컨티뉴에이션 캡처 |
| 역추적 | 여러 컨티뉴에이션 저장 |
관련 개념