[JavaScript] 제너레이터(Generator)

제너레이터(Generator)

제너레이터는 중단점이있는 함수이다. 부가적으로 더 말해보면 이터레이터이자 이터러블을 생성하는 함수이다.

이터러블이란 순회 가능한 객체이다.

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

let iter = gen();
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: 100, done: true}
function *gen() {
yield 1;
yield 2;
yield 3;
return 100;
}

let iter = gen();

for (const num of iter) {
console.log(num)// 1,2,3
}

제너레이터 사용법은 일반함수에서 앞에 *을 붙여서 제너레이터 함수를 만든다. 

이렇게 작성한 제너레이터는 이터레이터를 반환한다. (순회 가능한 값?)

이렇게 반환된 이터레이터는 next() 메서드를 호출하여 한 단계식 순회하며 객체를 반환한다.

제너레이터에서는 중단점을 yield로 구분한다. 이러한 yield는 중단점이면서 값을 반환하기도 한다.


제너레이터 함수를통해 반환된 이터레이터는 이터러블이기도 하다.

제너레이터를 통해 반환된 이터레이터는 [Symbol.iterator] 메서드를 가지고있고 iter[Symbol.iterator] 메서드의 실행결과는 자기자신이다. 

그러므로 제너레이터는 이터레이터를 반환하는 함수이다.


제너레이터 함수의 실행결과가 이터러블이자 이터레이터이기 때문에 for...of 문으로 순회도 가능하다. 

그리고 제너레이터는 next()로 값을 한단계식 출력할 수 있지만 for...of 문으로 순회시에는 return값은 생략되고 순회하며 값을 반환한다.


자바스크립트에서는 어떠한 값이던 이터러블이면 순회할 수 있다. 

그렇게 때문에 제너레이터를 이용하여 순회할 수 있는 값을 만들 수 있기때문에 자바스크립트에서는 이러한 제너레이터를 통해서 어떠한 값이나 상태, 문장도 순회할 수 있는 이터러블로 쉽게 만들 수 있다.

마지막으로 무한 반복문을 사용하여도 제너레이터 함수를 사용하면 중단하면서 값을 반환할 수 있다.



댓글