타입스크립트 언어가 제공하는 반복기, 반복기 제공자, 생성기에 대해서 알아보자.
for...of
와 같은 구문을 반복기(iterator)
라고 한다. 프로그래밍 언어마다 구현 방법이 다르긴 하지만, 대부분 프로그래밍 언어에서 반복기는 다음과 같은 특징이 있다.
next
라는 이름의 메서드를 제공한다.next
메서드는value
와done
이라는 두 개의 속성을 가진 객체를 반환한다.
다음 코드에서 createRangeIterable
함수는 next
메서드가 있는 객체를 반환하므로, 이 함수는 반복기를 제공하는 역할을 한다. 이처럼 반복기를 제공하는 역할을 하는 함수를 반복기 제공자(iterable)
라고 한다.
export const createRangeIterable = (from: number, to: number) => {
let currentValue = from;
return {
next () {
const value = currentValue < to ? currentValue++ : undefined;
const done = value === undefined;
return {value, done};
}
}
}
다음 코드는 createRangeIterable
함수가 제공하는 반복기를 사용하는 예이다.
import {createRangeIterable} from './createRangeIterable'
const iterator = createRangeIterable(1, 3+1); // 이 시점에서 반복기는 동작하지 않는다.
while (true) {
const {value, done} = iterator.next(); // 반복기를 동작시킨다.
if (done) break;
console.log(value); // 1 2 3
}
반복기 제공자는 이처럼 어떤 범위의 값을 한꺼번에 생성해서 배열에 담지 않고 값이 필요할 때만 생성한다.
export const range = (from, to) => from < to ? [from, ...range(from + 1, to)] : []
createRangeIterable
함수는 값이 필요한 시점에 생성하지만, range
함수는 값이 필요한 시점보다 이전에 미리 생성한다는 차이가 있다. 따라서 시스템 메모리의 효율성이라는 관점에서 보면 createRangeIterable
함수가 메모리를 훨씬 적게 소모한다.