제너레이터
06 May 2021제너레이터란 이터레이터를 사용해 자신의 실행을 제어하는 함수입니다. 일반적인 함수는 매개변수를 받고 값을 반환하지만, 호출자는 매개변수 외에는 함수의 실행을 제저할 방법이 전혀 없습니다. 함수를 호출하면 그 함수가 종료될 때까지 제어권을 완전히 넘기는 것입니다. 제너레이터에서는 그렇지 않습니다.
제너레이터에는 2가지 새로운 개념이 있습니다.
- 함수의 실행을 개별적 단계로 나눔으로써 함수의 실행을 제어한다.
- 실행 중인 함수와 통신한다.
제너레이터와 일반적인 함수는 2가지의 차이가 있습니다.
- 제너레이터는 언제든 호줄자에게 제어권을 넘길 수 있다.
- 제너레이터는 호출한 즉시 실행되지 않습니다. 대신 이터레이터를 반환하고, 이터레이터의 next 메소드를 호출함에 따라 실행 됩니다.
EX) 제너레이터를 호출하면 이터레이터를 얻게됩니다.
function* rainbow(){
yield 'red'
yield 'orange'
yield 'yellow'
yield 'green'
yield 'blue'
yield 'navy'
yield 'violet'
}
let it = rainbow()
it.next() // {value:'red', done:false}
it.next() // {value:'orange', done:false}
it.next() // {value:'yellow', done:false}
it.next() // {value:'green', done:false}
it.next() // {value:'blue', done:false}
it.next() // {value:'navy', done:false}
it.next() // {value:'violet', done:false}
it.next() // {value:undefined, done:true}
제너레이터에서 중요한건 양방향 통신이 된다는 것 입니다.
function* interrogate() {
const name = yield "What is your name"
const food = yield "what is your favorite food"
return `${name}'s favorite food is ${food}`
}
let it = interrogate()
it.next() // {value: "what is your name", done:false}
it.next('Ethan') // {value: "what is your favorite food", done:false}
it.next('orange') // {value: "Ethan's favorite food is orange", done:true}
각 각의 단계에서 어떤일이 일어난건지에 대해 알아보겠습니다.
let it = iterrogate()
를 하면 일단 제너레이터는 이터레이터를 반환합니다.it.next()
이터레이터의 value는 what is your name이 되고 yield를 멈춥니다.it.next('Ethan')
제너레이터에 Ethan이 넘겨지고 name에는 Ethan 저장되고 다시 what is your favorite food를 넘기고 다시 멈춥니다.it.next('orange')
제너레이터에 orange를 넘기고 Ethan’s favorite food is orange를 리턴합니다. yield와 다르게 return을 이용하면 done은 true로 반환됩니다. 즉 return으로 반환하면 루프를 이용해 접근했을때 프로퍼티를 반환하지 않는 다는 것에 주의해야합니다.
출처
- Learning JavaScript (한빛 미디어)