제너레이터

taehyung·2025년 5월 26일

JavaScript

목록 보기
15/15

제너레이터는 이터러블이자 이터레이터를 생성하는 함수이다.

제너레이터 함수는 이터러블/이터레이터를 생성한다

제너레이터를 실행하면 이터레이터를 반환하고 제너레이터 함수 내에서 yield 값을 이용하여 이터레이터의 value로 사용한다.

function *gen() { // 제너레이터 생성 문법
	yield 1;
  	yield 2;
  	yield 3;
}
    
const iter = gen();

console.log(iter.next())//{value: 1, done: false}
console.log(iter.next())//{value: 2, done: false}
console.log(iter.next())//{value: 3, done: false}
console.log(iter.next())//{value: undefined, done: true}
console.log(iter[Symbol.iterator]() === iter) // 잘만들어진 이터레이터 ( 웰폼드 이터레이터 ) 는 실행 했을 때 자기 자신을 리턴한다.


for(const v of gen()) console.log(v) //순회도 물론 가능함


function *gen(bool) { // 일반 함수처럼 작성해서 반복 값을 조건에 따라 생성할 수 있음
	yield 1;
  	if(bool) yield 2;
  	yield 3;
}

제너레이터 함수는 문장(코드)을 통해 그 어떤 값이든 순회할 수 있는 이터러블을 만들 수 있습니다.

예제

//주어진 숫자중 홀수만을 추출한 이터러블을 생성하는 제너레이터
function *odd(num){
  for(let i=0; i < num; i ++){
    if(i % 2) {
      yield i
    }
  }
}

const iter = odd(10)
//주어진 숫자부터 시작하는 무한히 증가하는 값을 가진 이터러블을 생성하는 제너레이터
function *infinity(num = 0){
  while(true) yield num++
}

const iter = infinity(0)

iter.next() // {value : 0, done:false}
iter.next()// {value : 0, done:false}
iter.next()// {value : 0, done:false}
...
// {value : 9999, done:false}

무한하면 프로그램이 멈추지는 않나요..?
네 이터레이터의 값을 평가할 때 까지만 작동하기 때문에 무한히 실행되지는 않습니다. 단, for문을 통해 순회하면 멈춥니다.

이터러블/이터레이터 프로토콜을 사용하기 때문에 구조분해할당, 나머지 연산자 등을 사용할 수 있다.

function *odd(num){
  for(let i=0; i < num; i ++){
    if(i % 2) {
      yield i
    }
  }
}

const [x,y, ...rest] = odd(10)
const oddClone = [...odd(10)]
const oddAdd = [...odd(10),...odd(20)]
profile
Front End

0개의 댓글