반응형
제너레이터 함수(generator function; 줄여서 제너레이터)
제너레이터 함수는 여러 개의 값을 생성하는 편리한 기능을 제공합니다.
제너레이터 함수를 이용하면 값을 생산하는 속도도 정교하게 조절할 수 있습니다.
제너레이터 함수는 소비자가 요청해야만 다음 값을 계산하기 때문에 무한의 목록 생성기 같은 까다로운 기능을 제공할 수 있습니다.
제너레이터 함수는 아래처럼 동작합니다.
function* createFibonacciGenerator() { // ①
let a = 0
let b = 1
while (true) { // ②
yield a; // ③
[a, b] = [b, a + b] // ④
}
}
let fibonacciGenerator = createFibonacciGenerator();
fibonacciGenerator.next() // { value: 0, done: false }
fibonacciGenerator.next() // { value: 1, done: false }
fibonacciGenerator.next() // { value: 1, done: false }
fibonacciGenerator.next() // { value: 2, done: false }
fibonacciGenerator.next() // { value: 3, done: false }
fibonacciGenerator.next() // { value: 5, done: false }
① 함수명 앞에 붙은 별표(*)는 이 함수가 제너레이터임을 의미합니다. 제너레이터를 호출하면, Iterable 반복자가 반환됩니다.
② 제너레이터는 영구적으로 값을 생성할 수 있습니다.
③ 제너레이터는 yield라는 키워드로 값을 방출합니다. 소비자가 제너레이터에 next를 호출하면, yield를 이용하여 결과를 소비자에게 보내고, 소비자가 next를 다시 호출하기 전까진 실행을 중지합니다. 이런 방식으로 동작하므로 while(true) 루프가 영원히 실행되다가 비정상 종료가 되는 상황이 일어나지 않습니다.
④ 다음 피보나치 숫자를 계산하기 위해 a에 b를, b에 a + b를 한 번에 다시 할당합니다.
앞 코드의 createFibonacciGenerator 함수는 IterableIterator를 반환하고, 이 제너레이터에 next를 호출할 때마다 다음 피보나치 값을 계산해서 결과를 방출합니다.
TypeScript가 방출된 값의 타입을 이용해 반복자의 타입을 추론함을 알 수 있습니다.
아래 예처럼 IterableIterator에서 방출하는 타입을 감싸서 제너레이터의 타입을 명시하는 방법도 있습니다.
function* createNumbers(): IterableIterator<number> {
let n = 0
while (1) {
yield n++
}
}
let numbers = createNumbers()
numbers.next() // { value: 0, done: false }
numbers.next() // { value: 1, done: false }
numbers.next() // { value: 2, done: false }
반응형
'👶 TypeScript' 카테고리의 다른 글
호출 시그니처 (0) | 2023.01.12 |
---|---|
반복자 (0) | 2023.01.11 |
TypeScript 실행 (0) | 2023.01.11 |
this의 타입 (0) | 2023.01.11 |
call, apply, bind (0) | 2023.01.11 |