Skip to content

Latest commit

 

History

History
97 lines (70 loc) · 3.29 KB

제너레이터.md

File metadata and controls

97 lines (70 loc) · 3.29 KB

제너레이터

제너레이터(Generator, 생성기)

💡 Generator 객체는 generator function으로부터 반환된 값이며 반복자와 반복자 프로토콜을 준수합니다. **코드 블록의 실행을 일시 중지 (블로킹) 했다가 필요한 시점에 재개할 수 있는 특수한 함수**

특징

  • iterator이고 iterable이다.

    • Iterable

      Symbol.iterator 메서드가 있다.

      Symbol.iterator는 iterator를 반환해야 한다.

    • itrator

      next 메서드를 가진다.

      next 메서드는 value와 done속성을 가진 객체를 반환한다.

      작업이 끝나면 done은 true가 된다.

  • 함수의 실행을 중간에 멈췄다가 재개할 수 있는 기능. 다른 작업을 하다가 다시 돌아와서 next() 해주면 진행이 멈췄던 부분부터 이어서 실행

  • 요청에 따라 그 산출된(yielded, yield 식으로 산출된) 값을 계산하고, 계산하기 비싼(힘든) 수열 또는 무한 수열이라도 효율적으로 나타내게함.

  • 값을 미리 만들어두지 않아 메모리 관리 측면에서 효율적임

  • break가 없는 while(true)도 사용가능함

  • 필요한 순간까지 계산을 미룰 수 있다

문법

function* gen() {
	try {
	  yield 1;
	  yield 2;
	  yield 3;
	} catch (e) {
		console.log(e);
}

var g = gen(); // "Generator { }"

스크린샷 2022-02-06 오후 6.39.23.png

메서드

  • next()

    yield 표현을 통해 yield된 값을 반환합니다. 가장 가까운 yield문을 실행하고 종료됩니다.

    또한 생성기의 내부 상태를 수정하는 데 쓰일 수 있는 값을 받습니다. next()에 전달되는 값은 생성기가 중단된 마지막 yield 식의 결과로 처리됩니다.

    • 예제

      function* fibonacci(){
        var fn1 = 0;
        var fn2 = 1;
        while (true){
          var current = fn1;
          fn1 = fn2;
          fn2 = current + fn1;
          var reset = yield current;
          if (reset){
              fn1 = 0;
              fn2 = 1;
          }
        }
      }
      
      var sequence = fibonacci();
      console.log(sequence.next().value);     // 0
      console.log(sequence.next().value);     // 1
      console.log(sequence.next().value);     // 1
      console.log(sequence.next().value);     // 2
      console.log(sequence.next().value);     // 3
      console.log(sequence.next().value);     // 5
      console.log(sequence.next().value);     // 8
      console.log(sequence.next(true).value); // 0
      console.log(sequence.next().value);     // 1
      console.log(sequence.next().value);     // 1
      console.log(sequence.next().value);     // 2
  • return()

    주어진 값을 반환하고 생성기를 종료합니다.

  • throw()

    생성기로 에러를 throw합니다.