Iteration Protocols(순회 규약)
Iteration Protocols은 자바스크립트의 새로운 객체나 문법이 아니라, 순회(Iteration, 반복)을 표준화하기 위한 규칙(protocols)입니다.
이 규약은 ECMAScript 2015(ES6) 이후 배열, 문자열, Map, Set 등 다양한 객체를 일관되게 순회할 수 있게 하는 공통 인터페이스(Common Iteration Interfaces)를 제공합니다.
자바스크립트의 도입 초기에는 순회에 대한 명확한 규칙이 없었습니다.
배열, 객체, 문자열, DOM 컬렉션 등 다양한 객체가 있었지만, 순회가 필요하면 내부 메서드나 반복문을 직접 사용해야 했습니다.
즉, 객체마다 순회 방식이 달라 혼란스러운 상황이 발생했습니다.
하지만 자바스크립트가 발전하면서 Map, Set 같은 새로운 컬렉션 객체가 등장했고, 이를 다루기 위해 표준화된 순회 규칙이 필요했습니다.
그래서 고안된 것이 바로 Iteration Protocols입니다.
즉, 객체의 순회는 어떤 규칙으로 적용되는지에 대한 두 가지 공통 인터페이스(Common Iteration Interfaces)를 명세서로 규정한 것입니다.
규약의 적용 시점
앞서 언급한 바와 같이, 이 규약은 ECMAScript 2015(ES6) 이후 발표되었습니다.
이전의 순회 방식은 호환성을 위해 그대로 유지되며, 발표 이후 등장한 새로운 객체의 순회에서는 이 규약이 적용됩니다.
두 가지 규칙
Iteration Protocols에는 순회를 정의하는 두 가지 인터페이스에 대한 규칙이 있습니다.
- Iterable Interface
- Iterator Interface
Iterable Interface - 순회 가능한 객체에 대한 인터페이스
Iterable Interface는 객체가 순회 가능한지 여부를 정의하는 인터페이스입니다.
이 정의를 가지는 객체는 다음과 같은 특징을 가집니다.
- 객체에
@@iterator(즉,Symbol.iterator메서드)가 있어야 합니다. for...of문으로 순회할 수 있습니다.
Iterator Interface - 실제 순회를 수행하는 인터페이스
Iterator Interface는 순회 가능한 객체를 실제로 순회할 때 사용하는 인터페이스를 정의합니다.
이 정의를 가지는 객체는 다음과 같은 특징을 가집니다.
- 객체가
next()메서드를 구현해야 합니다. - 이때,
next()메서드는{ value, done }객체를 반환해야 합니다.
세부 관련 규정과 추가 인터페이스 사항은 명세서의 공통 인터페이스(Common Iteration Interfaces)를 참고하세요!
규약이 적용되는 객체
Iteration Protocols은 ECMAScript 2015(ES6) 이후에 도입되어, 특정 객체들에 적용됩니다.
다음은 이 규약이 적용되는 대표적인 객체들입니다.
Iteration Protocols이 적용되는 객체를 공식 용어는 아니지만 통상적으로 '이터러블 객체'라고 부릅니다.
간단한 예제
앞서 언급한 것처럼 Iteration Protocols이 적용되는 객체는 for...of 문으로 순회할 수 있습니다.
// 배열 순회
const arr = [10, 20, 30];
for (const value of arr) {
console.log(value); // 10, 20, 30
}
// 문자열 순회
const str = "abc";
for (const char of str) {
console.log(char); // a, b, c
}
// Map 순회
const map = new Map([["a", 1], ["b", 2]]);
for (const [key, value] of map) {
console.log(key, value); // a 1, b 2
}
// Set 순회
const set = new Set([1, 2, 3]);
for (const value of set) {
console.log(value); // 1, 2, 3
}
유용성
Iteration Protocols의 도입으로 자바스크립트의 순회는 다음과 같은 장점을 가지게 되었습니다.
- 이 규약 발표 이후 등장한 새로운 객체의 순회에서는 동일한 순회를 할 수 있어 별도의 순회 방식을 고민할 필요가 없어졌습니다.
- 사용자 정의 객체를 만들어 사용할 때에도 순회가 필요하면 이 규약을 지키면 표준화된 순회를 할 수 있습니다.
- 개발자는 순회에 대해 편리하고 일관된 인터페이스를 활용할 수 있습니다.
명세서
| 명세서 사양 | |
|---|---|
| Iteration |
ECMAScript® 2026 Language Specification #sec-iteration |