[TypeScript] 반복기와 생성기

어느 개발자·2021년 5월 15일
0

TypeScript

목록 보기
4/5
post-thumbnail

타입스크립트 언어가 제공하는 반복기, 반복기 제공자, 생성기에 대해서 알아보자.

반복기와 반복기 제공자

for...of와 같은 구문을 반복기(iterator)라고 한다. 프로그래밍 언어마다 구현 방법이 다르긴 하지만, 대부분 프로그래밍 언어에서 반복기는 다음과 같은 특징이 있다.

  1. next라는 이름의 메서드를 제공한다.
  2. next 메서드는 valuedone이라는 두 개의 속성을 가진 객체를 반환한다.

다음 코드에서 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 함수가 메모리를 훨씬 적게 소모한다.

0개의 댓글