제너레이터 알아보기

HOONEY·2022년 3월 2일
0

Javascript

목록 보기
8/8
post-thumbnail

제너레이터(Generator)란?

  • ES6부터 도입된 함수로, 코드 블록의 실행을 일시 중지 했다가 필요한 시점에 재개할 수 있는 특수한 함수.
  • 일반 함수와의 차이가 있다.
    - 제너레이터 함수는 함수 호출자에게 함수 실행의 제어권을 양도 할 수 있다.
    - 제너레이터 함수는 함수 호출자와 함수의 상태를 주고받을 수 있다.
    - 제너레이터 함수를 호출하면 제너레이터 객체를 반환한다.

제너레이터 함수 정의

  • 제너레이터 함수는 function* 키워드로 선언한다.
// 제너레이터 함수 선언문
function* genDecFunc() {
	yield 1;
}

// 제너레이터 함수 표현식
const genExpFunc = function* () {
	yield 1;
}

제너레이터 객체

  • 제너레이터 함수를 호출하면 일반 함수처럼 함수 코드 블록을 실행하는 것이 아니라 제너레이터 객체를 생성해 반환한다.
  • 제너레이터 함수가 반환한 제너레이터 객체는 iterable이면서 동시에 iterator다.

제너레이터의 일시 중지와 재개

  • 제너레이터는 yield, next를 통해 실행을 일시 중지했다가 다시 재개할 수 있다.
  • yield는 제너레이터 함수의 실행을 일시 중지시키거나 yield 뒤에 오는 표현식의 평가 결과를 제너레이터 함수 호출자에게 반환한다.
// 제너레이터 함수
functuin* genFunc() {
	yield 1;
    yield 2;
    yield 3;
}

// 제너레이터 함수를 호출하면 제너레이터 객체를 반환한다.
// 이터러블이면서 동시에 이터레이터인 제너레이터 객체는 next 메소드를 갖는다.
const generator = genFunc();

// 처음 next 메소드를 호출하면 첫 번째 yield 표현식까지 실행되고 일시 중지된다.
// next 메소드는 이터레이터 result 객체({vaule, done})를 반환한다.
// value 프로퍼티에는 첫 번째 yield 표현식에서 yield된 값 1이 할당된다.
// done 프로퍼티에는 제너레이터 함수가 끝까지 실행되었는지를 나타내는 false가 할당된다.
console.log(generator.next()); // {value: 1, done: false}

// 다시 next 메소드를 호출하면 두 번째 yield표현식까지 실행되고 일시 중지된다.
// next 메소드는 이터레이터 result 객체({value, done})를 반환한다.
console.log(generator.next()); // {value: 2, done: false}
console.log(generator.next()); // {value: 3, done: false}

// value 프로퍼티에는 반환할 값이 없으므로 undefined
// done 프로퍼티에는 제너레이터가 끝까지 실행되었음을 나타내는 true 할당.
console.log(generator.next()); // {value: undefined, done: true}
  • 제너레이터 객체의 next 메소드를 호출하면 yield 표현식까지 실행되고 일시 중지 된다. 이때 함수의 제어권이 호출자로 양도된다.

제너레이터의 활용

  • 이터러블 구현
  • 비동기 처리 -> 너무 장황하고 가독성이 나쁘기 때문에 async/await 사용
profile
기록하는 블로그

0개의 댓글