이터러블 프로토콜(Iterable protocol)과 이터레이터 프로토콜(Iterator 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"] 출력
이터레이터 프로토콜은 이터레이터 객체를 정의하는 프로토콜입니다. 이터레이터 객체는 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 }
next()
메소드를 포함하는 이터레이터 객체를 정의해서 반복 작업을 수행하는 인터페이스를 제공하는 역할을 합니다.이 두 프로토콜은 서로 관련되어 있어, 이터러블 프로토콜을 구현한 객체로부터 이터레이터 객체를 생성하고 반복 작업을 처리할 수 있습니다. 이렇게 함으로써 코드 작성이 더 편리하고 가독성이 좋아집니다.