Generator 개념익히기
Generator(제너레이터)
제너레이터란 무엇인가?
- 함수이다.
- 조금은 이상하게 동작하는 함수이다. 보통 함수라 하면 값이 한개 또는 (없거나)를 반환하는데 제너레이터는 여러 개의 값을 반환한다. 그것도 함수(제너레이터) 외부에서 함수가 실행되는 중간에 특정 부분에서 멈추고 값을 외부에서 받아 하나씩 반환한다.
- 외적인 특징으로는 *를 함수에 붙이면 제너레이터 함수이다.
- 함수의 실행을 하게 되면 특정 키워드(yield)에서 멈추었다가 필요한 시점에서 다시 재개를 한다. 즉, 함수 중간에서 실행을 멈추는데 이때, 제어권은 호출자에게 양도(yield: 넘겨[양도]하다)하게 되고 호출자에 의해 다시 재개한다.
function* testGen() {
yield 1;
yield 2;
yield 3;
return 4;
}
const iter = testGen();
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: 4, done: false}
- 위 함수가 제너레이터 함수인데 이 함수가 호출되면 바로 코드가 실행되는 것이 아니고 호출하면 “이터레이터(iterator) 객체”를 반환하는 것이다.
- iterator 반복자 객체를 반환을 하게되는데 보통 it 또는 iter 라는 이름으로 받는다.
- 객체니까 내부적으로 어떤 메서드를 가지게 되는데 이것이 next() 메서드인데 이것은 제너레이터의 주요 메서드이다.
- next() 실행될 때 마다, 처음 나오는 yield 부분까지 실행하고 멈춘다. (또는 제어권을 호출자에게 양도한다)
- yield에서 멈췄을 때, yield 뒤의 “값(value)”을 반환한다. 만약 yield 뒤에 값이 없다면 undefined를 반환한다.
- 즉, next() 메서드를 사용하면 항상 value, done 2개의 속성을 가진 “객체”를 반환한다.
- value는 yield 뒤의 값, done은 함수 코드 실행이 끝났으면 true 아니면 false를 반환한다.
제너레이터(Generator) 함수 바깥의 외부에서 데이터 받아오기
- next() 메서드와 yield가 중간에 번갈아가면서 데이터를 주고 받는다.
- next() 메서드 호출하고 yield 키워드까지 실행하고(stop) 제어권을 함수 외부로 양도(yield) 이때 yield 뒤의 값이 반환된다.
function* testGen() {
const a = yield 1;
const b = yield (a * 1);
const c = yield (b + 2);
return a * b * c
}
cosnt iter = testGen();
console.log(iter.next()); //{value: 1, done: false}
console.log(iter.next(100)); //여기서 a = 100 {value: 100, done: false}
console.log(iter.next(48)); // 여기서 b = 48 {value: 50, done: false}
console.log(iter.next(2)); // 여기서 c = 2 {value: 9600, done: true}
위 코드의 값을 바꿔가면서 next() 메서드 실행시 어떤 값이 반환되는지 확인해보았다.
즉, 위 코드를 통해서 알 수 있듯이 제너레이터 함수와 이터레이터 객체의 next() 메서드는 서로 데이터를 주고 받을 수 있다.
댓글남기기