제너레이터 / 이터레이터

nn·2023년 6월 23일
0

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

제너레이터를 사용해 모든 순회 가능한 것들을 직접 생성할 수 있다.

제너레이터는 아래와 같이 *와 yield를 사용해 만들 수 있다.
제너레이터는 화살표 함수로 만들 수 없다.

function gen*(l) {
	while (l < 0){
    	yield l--
    }
}
const get5 = gen(5);

log(get5[Symbol.iterator]()); 

get5[Symbol.iterator]() 는 다음과 같이 콘솔에서 제너레이터임을 알 수 있다.

즉 제너레이터이므로 이터레이터를 가지고 있기 때문에
for of 를 사용해 순회할 수 있다.

  for (const a of get5) {
    log(a)
  }

이터러블을 돌면서 홀수만 출력하는 제너레이터를 만들어보자


funtion odds*(iter){
  for (const a of iter){
  		if (a % 2) yield a;
  	}
}

log(odds(gen(10)); // 9 7 5 3 1 출력

1부터 출력하기위해 다른 제너레이터 함수를 만들어보겠다.

function infinity*(l = 1){
  while (true) {
  	yield l++;
  }
}

function limit*(l, iter){
  for (const a of iter ) {
    yield a; 
  	if (iter === l){
  		return;
    } 
  }
}

1부터 숫자를 늘려가면서 이터레이터를 반환하는 인피니티와, 특정 숫자까지 도달하면 리턴하는 리밋 제너레이터를 만들었다.

function odds*(l){
	for (const a of limit(l, infinity(1)){
        if (a % 2) yield a;
    }
}
const  iter2 = odds(10);
 for (const a of iter2) {
      log (a);
}

다음과 같이 1부터 제한한 숫자까지 홀수만 출력할 수 있다.

profile
내가 될 거라고 했잖아

0개의 댓글