본문 바로가기

Dev/JAVASCRIPT

Javascript JS 제네레이터 (generator)

제네레이터 (generator) - 함수의 실행을 중간에 멈췄다가 재개할 수 있는 기능

// Generator
// .next() .return() .throw()
// yield 로 실행할 순서를 정할 수 있다.
// 처음 .next() 를 통해 다음 yield 전까지 실행
// 중간에 .return('value') 를 통해 value와 done 값을 true로 바꿀수 있다. 그 이후로는 .next()가 먹히지 않는다
// .return 과 마찬가지로 .throw('error') 를 통해 에러 메세지를 출력 가능하고 그후로는 .next()가 먹히지 않는다
// .throw의 경우 try catch 문으로 감싸야한다.
function* fn() {
  console.log(1);
  yield 1;
  console.log(2);
  yield 2;
  console.log(3);
  yield 3;
  return "finish";
}
const a = fn();
console.log(a);
console.log(a.next());
console.log(a.next());
console.log(a.next());
console.log(a.next());

 

외부로 부터 값을 입력 받음

// 제네레이터 (Generator) 는 외부로 부터 값을 입력 받을 수 있다. 
function* fn() {
  const num1 = yield "첫번째 숫자를 입력해주세요";
  console.log(num1);
  
  const num2 = yield "두번째 숫자를 입력해주세요";
  console.log(num2);
  
  return num1 + num2;
}

const a = fn();
console.log(a.next()); // 결과, {"value": "첫번째 숫자를 입력해주세요","done": false}
console.log(a.next(3)); // 결과, {"value": "두번째 숫자를 입력해주세요","done": false}
console.log(a.next(7)); // 결과, {"value": 10,"done": true}

 

무한 반복문

// 제네레이터 (Generator) 는 값을 미리 만들어 두지 않아서 메모리를 잡아먹지 않는다.
// 무한 반복을 돌려도 필요한 만큼만 생성을 하기 때문에 브라우저가 다운되지 않는다.
function* fn() {
  let index = 0;
  while (true) {
    yield index++;
  }
}
const a = fn();
console.log(a.next()); // 결과, {"value": 0,"done": false}
console.log(a.next()); // 결과, {"value": 1,"done": false}
console.log(a.next()); // 결과, {"value": 2,"done": false}
console.log(a.next()); // 결과, {"value": 3,"done": false}
console.log(a.next()); // 결과, {"value": 4,"done": false}
console.log(a.next()); // 결과, {"value": 5,"done": false}