JavaScript Generator

자바스크립트에서 제너레이터(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 메서드는 객체를 반환합니다. 이 객체는 valuedone 속성을 가집니다.

  • 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 }

제너레이터의 returnthrow

제너레이터 객체의 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 메서드를 통해 제너레이터의 실행을 제어할 수 있습니다. 이를 통해 복잡한 비동기 로직을 단순화하거나, 무한 시퀀스를 생성하는 등 다양한 용도로 활용할 수 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *