자바스크립트에서 제너레이터(Generator)는 함수의 실행을 중간에 멈췄다가 필요할 때 다시 시작할 수 있는 특별한 타입의 함수입니다. 제너레이터 함수는 일반 함수와 달리 function*
키워드를 사용하여 정의되며, yield
키워드를 사용하여 함수의 실행을 일시 중지하고 값을 반환할 수 있습니다.
제너레이터 함수 정의
제너레이터 함수는 function*
키워드로 정의합니다. 제너레이터 함수는 호출되면 실행되지 않고, 제너레이터 객체를 반환합니다. 이 객체는 next
메서드를 가지고 있으며, 이를 호출하여 제너레이터 함수의 실행을 제어할 수 있습니다.
function* generatorFunction() {
yield 'First output';
yield 'Second output';
return 'Final output';
}
const generator = generatorFunction();
console.log(generator.next()); // { value: 'First output', done: false }
console.log(generator.next()); // { value: 'Second output', done: false }
console.log(generator.next()); // { value: 'Final output', done: true }
console.log(generator.next()); // { value: undefined, done: true }
yield
키워드
yield
키워드는 제너레이터 함수의 실행을 일시 중지하고 값을 반환합니다. yield
가 호출될 때마다 함수의 실행 상태가 유지되며, 다음 next
호출 시점에서 다시 시작됩니다.
제너레이터의 상태와 done
속성
제너레이터의 next
메서드는 객체를 반환합니다. 이 객체는 value
와 done
속성을 가집니다.
value
: 현재yield
표현식의 결과값 또는return
값입니다.done
: 제너레이터 함수가 끝났는지 여부를 나타냅니다. 함수가 끝났다면true
, 그렇지 않다면false
입니다.
예제: 간단한 제너레이터 함수
다음 예제는 간단한 숫자 제너레이터 함수입니다.
function* numberGenerator() {
yield 1;
yield 2;
yield 3;
}
const numbers = numberGenerator();
console.log(numbers.next()); // { value: 1, done: false }
console.log(numbers.next()); // { value: 2, done: false }
console.log(numbers.next()); // { value: 3, done: false }
console.log(numbers.next()); // { value: undefined, done: true }
for...of
루프와 제너레이터
for...of
루프를 사용하여 제너레이터의 모든 값을 쉽게 순회할 수 있습니다.
function* numberGenerator() {
yield 1;
yield 2;
yield 3;
}
for (let value of numberGenerator()) {
console.log(value);
}
// Output:
// 1
// 2
// 3
제너레이터와 무한 시퀀스
제너레이터는 무한 시퀀스를 생성하는 데 유용할 수 있습니다.
function* infiniteSequence() {
let i = 0;
while (true) {
yield i++;
}
}
const sequence = infiniteSequence();
console.log(sequence.next().value); // 0
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 2
제너레이터에 값 전달
next
메서드에 값을 전달하여 yield
표현식을 통해 제너레이터 함수 내부로 값을 보낼 수 있습니다.
function* generatorFunction() {
const first = yield 'First output';
console.log(first); // 10
const second = yield 'Second output';
console.log(second); // 20
return 'Final output';
}
const generator = generatorFunction();
console.log(generator.next()); // { value: 'First output', done: false }
console.log(generator.next(10)); // { value: 'Second output', done: false }
console.log(generator.next(20)); // { value: 'Final output', done: true }
제너레이터의 return
과 throw
제너레이터 객체의 return
메서드를 사용하여 제너레이터 함수의 실행을 중지하고 값을 반환할 수 있습니다. throw
메서드를 사용하여 제너레이터 함수 내부에서 예외를 발생시킬 수 있습니다.
function* generatorFunction() {
try {
yield 'First output';
} catch (e) {
console.log(e); // 'Error!'
}
yield 'Second output';
}
const generator = generatorFunction();
console.log(generator.next()); // { value: 'First output', done: false }
console.log(generator.throw('Error!')); // { value: 'Second output', done: false }
console.log(generator.next()); // { value: undefined, done: true }
요약
자바스크립트의 제너레이터는 함수의 실행을 중간에 멈추고 다시 시작할 수 있는 특별한 함수입니다. function*
키워드와 yield
키워드를 사용하여 정의되며, next
, return
, throw
메서드를 통해 제너레이터의 실행을 제어할 수 있습니다. 이를 통해 복잡한 비동기 로직을 단순화하거나, 무한 시퀀스를 생성하는 등 다양한 용도로 활용할 수 있습니다.