본문 바로가기

programming/Javascript

[Javascript] 제너레이터 (Generator) 이터러블, 이터레이터와 비교

generator 

yield는 제너레이터 함수 안에 존재

next는 함수 밖에서 호출되는 메서드, yield를 순서대로 부름

 

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

let generator = generateSequence();

console.log(generator.next()); // {value: 1, done: false}
console.log(generator.next());
console.log(generator.next());
console.log(generator.next());

[실행결과]

 

어디서 많이 봤다.

어디서?

 

Symbol.iterator() 메소드가 반환하는 값 = interator

const array = [1, 2, 3];

// Symbol.iterator 메소드는 이터레이터를 반환한다.
const iterator = array[Symbol.iterator]();

// iterator는 next 메소드를 갖는다.
// next 메소드는 value, done 속성을 갖는 Result객체를 리턴한다
let iteratorResult = iterator.next();
console.log(iteratorResult); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: false}
console.log(iterator.next()); // {value: undefined, done: true}

[실행결과]

 

그럼 이전에 이터러블이고, 이터레이터인 함수로 피보나치 수열을 만든 소스코드가 있다.

이 소스코드를 제너레이터로 변환 해보자

 

[이터러블&이터레이터 피보나치 함수]

function fibo(max) {
    let [pre, cur] = [0, 1]
    return {
        [Symbol.iterator]() {
            return this
        },
        next() {
            [pre, cur] = [cur, pre+cur]
            return {
                value : cur,
                done : cur <= max
            }
        }
    }
}

let fiboIter = fibo(10);
console.log(fiboIter.next())
console.log(fiboIter.next())

[실행결과]

 

[제너레이터로 구현한 피보나치 수열 함수]

function* fiboGen(max){
    let [pre, cur] = [0, 1]
    while(pre+cur <= max){
        [pre, cur] = [cur, pre+cur]
        yield cur
    }
}

let fiboGenIter = fiboGen(10)
console.log(fiboGenIter.next())
console.log(fiboGenIter.next())
console.log(fiboGenIter.next())
console.log(fiboGenIter.next())
console.log(fiboGenIter.next())
console.log(fiboGenIter.next())

[실행결과]