iterable iterator protocol 이터러블

agnusdei·2023년 7월 23일
0

이터러블 프로토콜(Iterable protocol)과 이터레이터 프로토콜(Iterator protocol)은 모두 자바스크립트에서 사용되는 반복 작업을 처리하기 위한 프로토콜입니다. 두 프로토콜은 서로 관련이 있지만, 목적과 사용 방식에 약간의 차이가 있습니다.

이터러블 프로토콜(Iterable protocol)

이터러블 프로토콜은 객체를 반복 가능한 구조로 만들어주는 프로토콜입니다. 이터러블 객체는 Symbol.iterator 메소드를 구현해야 합니다. 이 메소드는 이터레이터를 반환하며, 이터레이터에는 next() 메소드가 있어 이를 호출할 때마다 다음 요소를 얻을 수 있습니다. 이터러블 프로토콜을 준수하는 객체는 스프레드 문법, 배열 디스트럭처링 할당 등과 같은 연산 및 구문에 사용할 수 있습니다.

예시:

const iterableObj = {
  0: "Hello",
  1: "World",
  length: 2,
  [Symbol.iterator]: function () {
    let index = 0;
    const self = this;
    return {
      next: function () {
        if (index < self.length) {
          return { value: self[index++], done: false };
        } else {
          return { done: true };
        }
      },
    };
  },
};

for (const item of iterableObj) {
  console.log(item); // "Hello"과 "World"가 차례로 출력됩니다.
}

const [first, second] = iterableObj; // 배열 디스트럭처링 할당
console.log(first, second); // "Hello" "World" 출력

const newArray = [...iterableObj]; // 스프레드 문법
console.log(newArray); // ["Hello", "World"] 출력

이터레이터 프로토콜(Iterator protocol)

이터레이터 프로토콜은 이터레이터 객체를 정의하는 프로토콜입니다. 이터레이터 객체는 next() 메소드를 포함하여 현재 위치의 다음 요소를 반환하고, 반복이 완료되었는지 여부를 나타내는 객체를 반환해야 합니다. 객체의 구조는 { value: Any, done: Boolean } 형태를 따릅니다.

예시:

const iteratorObj = {
  array: ["A", "B", "C"],
  cursor: 0,
  next: function () {
    if (this.cursor < this.array.length) {
      return { value: this.array[this.cursor++], done: false };
    } else {
      return { done: true };
    }
  },
};

console.log(iteratorObj.next()); // { value: "A", done: false }
console.log(iteratorObj.next()); // { value: "B", done: false }
console.log(iteratorObj.next()); // { value: "C", done: false }
console.log(iteratorObj.next()); // { done: true }

요약

  • 공통점: 이터러블 프로토콜과 이터레이터 프로토콜은 모두 자바스크립트에서 반복 작업을 처리하기 위한 코어 프로토콜입니다.
  • 차이점: 이터러블 프로토콜은 객체의 반복 작업을 가능하게 하는 역할을 합니다(Symbol.iterator 메소드 구현). 해당 객체는 스프레드 문법, 배열 디스트럭처링 할당 등에 사용할 수 있습니다. 반면, 이터레이터 프로토콜은 next() 메소드를 포함하는 이터레이터 객체를 정의해서 반복 작업을 수행하는 인터페이스를 제공하는 역할을 합니다.

이 두 프로토콜은 서로 관련되어 있어, 이터러블 프로토콜을 구현한 객체로부터 이터레이터 객체를 생성하고 반복 작업을 처리할 수 있습니다. 이렇게 함으로써 코드 작성이 더 편리하고 가독성이 좋아집니다.

0개의 댓글