generator와 iterator

minidoo·2021년 5월 20일
0
post-thumbnail

제너레이터

iterator이자 iterable을 생성하는 함수

순회할 값을 문장으로 표현
어떠한 값이든 순회할 수 있도록 만들어준다!

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

let iter = generataor();
console.log(iter[Symbol.iterator]() == iter);	// true
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}

제너레이터 함수에 return을 하면, 마지막 value 값에 리턴한 값이 담긴다.

function *generataor() {
    yield 1;
    yield 2;
    yield 3;
    return 100;
}

let iter = generataor();
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: 100, done: true}

일반 for문을 순회할 때는 return 값이 출력되지 않는다.
return 값은 next() 함수를 이용했을 때, done 값에 담긴다.

function *generataor() {
    yield 1;
    yield 2;
    yield 3;
    return 100;
}

let iter = generataor();
for(const a of generataor()) console.log(a);
1
2
3

예제) 홀수 출력하는 generator 함수 만들기

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

let iter = odds(10);
console.log(iter.next());	// {value: 1, done: false}
console.log(iter.next());	// {value: 3, done: false}
console.log(iter.next());	// {value: 5, done: false}
console.log(iter.next());	// {value: 7, done: false}
console.log(iter.next());	// {value: 9, done: false}

위의 예제에서 좀 더 심화된 코드로 작성해보자.

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

function *odds(l) {
	for(const a of infinity(1)) {
    	if(a % 2) yield a;
        if(a == l) return;
    }
}

let iter = odds(10);
console.log(iter.next());	// {value: 1, done: false}
console.log(iter.next());	// {value: 3, done: false}
console.log(iter.next());	// {value: 5, done: false}
console.log(iter.next());	// {value: 7, done: false}
console.log(iter.next());	// {value: 9, done: false}

for...of, 전개 연산자, 구조 분해, 나머지 연산자

for처럼 전개 연산자, 구조 분해, 그리고 나머지 연산자에서도 generator 함수를 사용할 수 있다.

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

// 전개 연산자
console.log(...odds(10));
console.log([...odds(10), ...odds(20)]);

// 1 3 5 7 9
// [1, 3, 5, 7, 9, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

// 구조 분해
let [start, ...end] = odds(10);
console.log(start);
console.log(end);

// 1
// [3, 5, 7, 9]

// 나머지 연산자
let [a, b, ...rest] = odds(10);
console.log(a);
console.log(b);
console.log(rest);

// 1
// 3
// [5, 7, 9]

참고 사이트

https://valuefactory.tistory.com/284

0개의 댓글