Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

codingfarm

2. 제너레이터 본문

설계/멀티패러다임

2. 제너레이터

scarecrow1992 2026. 1. 4. 14:04

1. 소개

제너레이터(Generator)함수의 실행을 중간에 멈췄다가 다시 이어서 실행할 수 있게 해주는 설계 방식(구조) 를 지칭하며,

자바스크립트의 제너레이터 함수는 iterator를 사용함으로써 함수 내부 코드의 호출타이밍을 사용자가 제어할 수 있게 해준다.

2. 문법

2-1. function*

자바스크립트에서 제너레이터 함수는 function* 키워드로 정의되며, 일반함수와 달리 한번에 끝까지 실행되지 않는다.

함수호출시 iterator를 반환하며, next() 함수를 호출할때마다, yield return 지점까지 실행을 재개한다.

(유니티 엔진의 코루틴처럼)

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

const iterator = generatorFunc();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

제너레이터는 명령문으로 구현되므로 아래와 같이 조건문을 사용할수 있다.

function* generatorFunc(condition: boolean) {
  yield 1;

  if (condition) yield 2;

  yield 3;
}

const iterator = generatorFunc(false);

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

2-2. yield*

제너레이터 함수내에서 이터러블(iterable)을 순회하며 해당 이터러블이 제공하는 요소들을 순차적으로 반환하는 키워드

(iterable : 반복을 지원하는 객체)

function* generatorFunc() {
  yield 1;

  yield* [2, 3, 4];

  yield 5;
}

const iterator = generatorFunc();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

아래와 같이 무한반복문을 활용하여, 프로세스나 브라우저의 지연이 없는 제너레이터 함수 작성이 가능하다.

function* generatorFunc() {
  let n = 1;
  while (true) {
    yield n++;
  }
}

const iterator = generatorFunc();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }

3. 응용

3-1. 제너레이터를 이용한 reverse 함수

제너레이터를 이용하여 역순회가 가능한 iterator를 반환하는 generator 함수를 구현해보자.

function* reverse<T>(arrayLike: ArrayLike<T>): IterableIterator<T> {
  let idx = arrayLike.length;

  while (idx) {
    yield arrayLike[--idx];
  }
}

const arr = [0, 1, 2, 3, 4];
const iter = reverse<number>(arr);

console.log(iter.next().value); // 4
console.log(iter.next().value); // 3
console.log(iter.next().value); // 2

'설계 > 멀티패러다임' 카테고리의 다른 글

3. 자바스크립트의 이터레이션 프로토콜  (0) 2026.01.04
1. 반복자 패턴  (0) 2026.01.04
Comments