Generator

Generator

Generator 객체는 generator 함수에 의해 반환되며 iterable 프로토콜과 iterator 프로토콜을 모두 충족한다. GeneratorIterator 클래스의 하위 클래스이다.

출처: Generator - JavaScript | MDN

본문

생성자(Constructor)

Generator 생성자에 대응하는 JavaScript 엔티티는 없다. Generator의 인스턴스는 generator 함수로부터 반환되어야 한다:

function* generator() {
  yield 1;
  yield 2;
  yield 3;
}

const gen = generator(); // "Generator { }"

console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3

generator 함수가 만든 모든 객체가 공유하는 숨겨진 프로토타입 객체가 하나만 있다. 이 객체는 클래스처럼 보이도록 종종 Generator.prototype으로 표기하지만, GeneratorFunction이 실제 JavaScript 엔티티이므로 실은 GeneratorFunction.prototype.prototype이라고 부르는 것이 더 적절하다. Generator 인스턴스의 프로토타입 체인을 이해하려면 GeneratorFunction.prototype.prototype을 참조하라.

인스턴스 속성(Instance properties)

Generator.prototype에 정의되며 모든 Generator 인스턴스가 공유한다.

  • Generator.prototype.constructor — 인스턴스 객체를 생성한 생성자 함수. Generator 인스턴스의 초기 값은 GeneratorFunction.prototype이다.

참고: Generator 객체는 자신을 만든 generator 함수에 대한 참조를 저장하지 않는다.

  • Generator.prototype[Symbol.toStringTag][Symbol.toStringTag] 속성의 초기 값은 문자열 "Generator". Object.prototype.toString()에서 사용된다.

인스턴스 메서드(Instance methods)

또한 부모 Iterator로부터 인스턴스 메서드를 상속받는다.

  • Generator.prototype.next()yield 표현식이 만들어낸 값을 반환한다.
  • Generator.prototype.return() — generator 본문의 현재 일시 중지된 위치에 return 문이 삽입된 것처럼 동작한다. 이는 generator를 종료하며, try...finally 블록과 함께 사용하면 generator가 정리 작업(cleanup)을 수행할 수 있게 한다.
  • Generator.prototype.throw() — generator 본문의 현재 일시 중지된 위치에 throw 문이 삽입된 것처럼 동작한다. 이는 generator에 오류 상황을 알리고, 오류를 처리하거나 정리하고 스스로 닫을 수 있게 한다.

예제

무한 반복자(An infinite iterator)

generator 함수를 사용하면 값이 필요할 때까지 평가되지 않는다. 따라서 generator는 잠재적으로 무한한 데이터 구조를 정의할 수 있게 해 준다.

function* infinite() {
  let index = 0;

  while (true) {
    yield index++;
  }
}

const generator = infinite(); // "Generator { }"

console.log(generator.next().value); // 0
console.log(generator.next().value); // 1
console.log(generator.next().value); // 2
// …

명세(Specifications)

  • ECMAScript® 2027 Language Specification — sec-generator-objects

브라우저 호환성

baseline 기준 2016년 9월부터 널리 사용 가능하다. 호환성 표는 JavaScript를 활성화해야 볼 수 있다.

참고 자료

  • function*
  • function* 표현식
  • GeneratorFunction
  • Iteration protocols

더 알아보기