[TIL] 8/13

예도리·2021년 8월 14일
0
post-thumbnail

이터러블, 이터레이터, 제너레이터의 기본 개념 요약(?)

iterable

  • 말그대로 반복 가능한 객체이다.
  • 이터러블 프로토콜을 준수하는 객체는 Symbol.iterator 메서드를 가지고 있으며 이터레이터를 반환한다.
  • 이터러블은 for...of...을 적용할 수 있다.

iterator

  • next 메서드를 가지고 있고 호출 시 이터러블을 순회하며 value, done 프로퍼티를 갖는 iterator result 객체를 반환한다. 이터러블의 각 요소를 순회하기 위한 포인터의 역할을 한다.

이터러블이면서 이터레이터인 객체?!

  • 이터러블의 Symbol.iterator를 소유하고, 이터레이터의 next를 소유한다!
  • Symbol.iterator는 next를 가지고 있는 자기 자신 = 이터레이터를 반환한다.
  • 당연히 for...of, ... 사용이 가능하다!
const fibonacciFunc = function (max) {
  let [pre, cur] = [0, 1];

  // Symbol.iterator 메소드와 next 메소드를 소유한
  // 이터러블이면서 이터레이터인 객체를 반환
  return {
    // Symbol.iterator 메소드
    [Symbol.iterator]() {
      return this;
    },
    // next 메소드는 이터레이터 리절트 객체를 반환
    next() {
      [pre, cur] = [cur, pre + cur];
      return {
        value: cur,
        done: cur >= max
      };
    }
  };
};

generator

  • 이터러블을 생성하는 함수
  • 이터레이션 프로토콜을 준수해 이터러블을 생성하는 방식보다 간편하게 구현 가능
const createInfinityByIteration = function () {
  let i = 0; // 자유 변수
  return {
    [Symbol.iterator]() { return this; },
    next() {
      return { value: ++i };
    }
  };
};

// 무한 이터러블을 생성하는 제너레이터 함수
function* createInfinityByGenerator() {
  let i = 0;
  while (true) { yield ++i; }
}
  • 제너레이터 함수를 호출하면 제너레이터를 반환한다. 이 제너레이터는 Symbol.iterator 메서드를 소유한 이터러블이면서 next 메서드를 소유한 이터레이터다.
  • 코드 블록이 한 번에 실행되지 않고 실행을 일시 중지했다가 필요한 시점에 재시작한다.
    • next()를 호출하면 가장 가까운 yield문을 만날 때까지 실행되다가 만나면 실행 중단하고 value를 반환한다.

마무리

이제 이터러블, 이터레이터, 제너레이터가 뭔지는 완벽히 이해한 것 같다!! 응용해서 문제를 푸는 건 별개지만,, 그래도 강의 복습하면서 연습 문제 풀다보면 과제도 이해할 수 있을 것 같다,, 🥲

출처

0개의 댓글