[javascript] Iterator, Generator

1 minute read

Iterator

이터레이터는 시퀀스를 정의하고 종료시의 반환값을 잠재적으로 정의하는 객체이다. 이터레이터의 next() 메서드를 호출하면 value 프로퍼티와 done 프로퍼티를 반환한다. 이터레이터를 생성하면 next() 메서드를 반복적으로 호출하여 명시적으로 반복시킬 수 있다. 마지막 값을 반환하고 추가적으로 next()를 추가적으로 호출하면 { done: true } 가 반환된다.

const fruit = ["apple", "banana", "cherries"];
const it = fruit.values();

it.next(); // { value: "apple", done: false}
it.next(); // { value: "banana", done: false}
it.next(); // { value: "cherries", done: false}
it.next(); // { value: undefined, done: true}
it.next(); // { value: undefined, done: true}

이터레이터는 그 자체로 크게 쓸모가 있다기보다는, 더 쓸모 있는 동작이 가능해지도록 한다는데 의미가 있다. 이터레이터 프로토콜은 모든 객체를 이터러블(iterable) 객체로 바꿀 수 있다. 이터레이션 프로토콜은 클래스에 심볼 메서드 Symbol.iterator가 있고 이 메서드가 이터레이터처럼 동작하는 객체, 즉 valuedone 프로퍼티가 있는 객체를 반환하는 next 메서드를 가진 객체를 반환한다면 그 클래스의 인스턴스는 이터러블 객체라는 뜻이다.

Generator

제너레이터란 이터레이터를 사용해 자신의 실행을 제어하는 함수이다. 제너레이터는 두 가지 새로운 개념을 도입했다 하나는 함수의 실행을 개별적 단계로 나눔으로써 함수의 실행을 제어한다는 것이고, 다른 하나는 실행 중인 함수와 통신한다는 것이다. 제너레이터는 두 가지 예외를 제외하면 일반적인 함수와 같다.

  • 제너레이터는 언제든 호출자에게 제어권을 넘길(yield)수 있다.
  • 제너레이터는 호출한 즉시 실행되지 않는다. 대신 이터레이터를 반환하고, 이터레이터의 next 메서드를 호출함에 따라 실행된다.

제너레이터를 만들 때는 function 키워드 뒤에 애스터리스크(*)를 붙인다. 또한 return 외에 yield를 쓸 수 있다.

function* rainbow() {
  yield "red";
  yield "orange";
  yield "yellow";
  yield "green";
  yield "blue";
  yield "indigo";
  yield "violet";
}

제네레이터를 호출하면 이터레이터를 얻는다. 함수를 호출한 다음 이터레이터를 써서 단계별로 진행한다.

const it = rainbow();
it.next(); // { value: "red", done: false };
it.next(); // { value: "orange", done: false };
it.next(); // { value: "yellow", done: false };
it.next(); // { value: "green", done: false };
it.next(); // { value: "blue", done: false };
it.next(); // { value: "indigo", done: false };
it.next(); // { value: "violet", done: false };
it.next(); // { value: undefined, done: true };

Updated: