제너레이터는 코드 블록의 실행을 일시 중지했다가 필요한 시점에 재개할 수 있는 특수한 함수입니다.
제너레이터 함수는 function*
키워드로 선언합니다. *(애스터리스크)
의 위치는 function 키워드와 함수 이름 사이라면 어디든지 상관없지만 일관성을 위해 function 키워드 바로 뒤에 붙이는걸 권장합니다.
하나 이상의 yield 표현식을 포함합니다.
제너레이터 함수는 화살표 함수로 정의할 수 없습니다.
제너레이터 함수는 new 연산자와 함께 생성자 함수로 호출할 수 없습니다.
function* generateFn() {
yield 1;
yield 2;
return 3;
}
// 일반 함수
function normalFunction() {
console.log('Start of normal function');
console.log('End of normal function');
}
// 제너레이터 함수
function* generatorFunction() {
console.log('Start of generator function');
yield; // 중간에 일시정지
console.log('End of generator function');
}
// 일반 함수 실행
normalFunction(); // 호출하면 Start~End까지 호출될 때 사용자가 제어할 수 없다.
// 제너레이터 함수 실행
const generator = generatorFunction();
generator.next(); // Start of generator function 출력 후 일시정지
// 만약 End of 까지 출력하고 싶다면? => next를 호출
generator.next(); // End of generator function 출력 후 일시정지
function* gen() {
let ask1 = yield '2 + 2 = ?';
console.log(ask1);
let ask2 = yield '3 * 3 = ?';
console.log(ask2);
}
// 제너레이터 함수 실행
let generator = gen();
// '2 + 2 = ?' 질문
console.log(generator.next().value);
// value 값으로 4를 전달
console.log(generator.next(4).value);
// 4가 출력, '3 * 3 = ?' 질문
console.log(generator.next(9).done);
// 9를 전달,
// 9출력, true 출력
// console에 찍히는 모습
// 2 + 2 = ?
// 4
// 3 * 3 = ?
// 9
// true
이터러블? 이터레이터? 이터러블, 이터레이터 확인하러 가기
이터러블을 직접 구현한것과 제너레이터의 차이를 확인해보겠습니다.
우선 이터레이션 프로토콜을 준수하여 무한 피보나치 수열을 생성하는 함수를 구현
제너레이터를 활용한 무한 피보나치 함수
확실히 간단해진 걸 확인할 수 있습니다.
훌륭한 개발자들은 이런거 또 못보기 때문에 제너레이터보다 더 간단하고 가독성 좋게 비동기 처리를 동기처리 처럼 동작하도록 구현할 수 있는 기술을 개발해냈습니다.
그것은 바로 async, await입니다. 이건 다음 글에서 또 작성해보겠습니다.