이터레이션 프로토콜(이터러블 + 이터레이터)

boyeonJ·2023년 6월 11일
0
post-thumbnail

이터레이션 프로토콜(iteration protocol)이란?

ES6에서 도입된 이터레이션 프로토콜(iteration protocol)은 데이터 컬렉션을 순회하기 위한 프로토콜(미리 약속된 규칙)이다. 이터레이션 프로토콜을 준수한 객체는 1. for…of 문으로 순회할 수 있고 2. Spread 문법의 피연산자가 될 수 있다.

이터레이션 프로토콜에는 아래 두가지 프로토컬이 있습니다.
2. 이터레이터 프로토콜(iterator protocol)
1. 이터러블 프로토콜(iterable protocol)

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

이터레이터 프로토콜준수한 객체이터레이터이라 한다.

  1. 이터레이터는 next 메서드를 가지고 있어야 하며, next 메서드를 호출할 때마다 순회할 때의 다음 값을 가진 객체를 반환해야 합니다.
  2. next 메서드는 { value, done } 형태의 객체를 반환해야 합니다. value는 현재 순회 중인 값이며, done은 순회가 끝났는지를 나타내는 불리언 값입니다.

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

이터러블 프로토콜준수한 객체이터러블이라 한다.

  1. Symbol.iterator 메서드를 가지고 있어야 합니다. 이 메서드는 이터레이터(iterator)를 반환하는 특별한 메서드입니다.
  2. 이터러블은 for…of 문에서 순회할 수 있으며 Spread 문법의 대상으로 사용할 수 있다.

// 배열은 이터러블 프로토콜을 준수한 이터러블이다.
const array = [1, 2, 3];

// Symbol.iterator 메소드는 이터레이터를 반환한다.
const iterator = array[Symbol.iterator]();

// 이터레이터 프로토콜을 준수한 이터레이터는 next 메소드를 갖는다.
console.log('next' in iterator); // true

// 이터레이터의 next 메소드를 호출하면 value, done 프로퍼티를 갖는 이터레이터 리절트 객체를 반환한다.
// next 메소드를 호출할 때 마다 이터러블을 순회하며 이터레이터 리절트 객체를 반환한다.
console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: false}
console.log(iterator.next()); // {value: undefined, done: true}

자바스크립트 in 연산자


ES6에서 제공하는 빌트인 이터러블은 다음과 같습니다.

Array, String, Map, Set, TypedArray(Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array), DOM data structure(NodeList, HTMLCollection), Arguments


Map의 특정 매소드는 iterabl 이다.

Map 객체의 keys() 메서드와 values() 메서드로 반환되는 값이 이터러블(iterable) 객체로 간주되는 이유는 해당 메서드들이 이터러블 프로토콜(iterable protocol)을 준수하기 때문입니다.

Map 객체는 이터러블 프로토콜을 준수하기 위해 keys() 메서드와 values() 메서드에 해당 프로토콜을 구현하였습니다. 이들 메서드는 각각 이터러블 객체인 MapIterator를 반환하며, MapIterator는 next() 메서드를 가지고 있어 순회 가능한 값을 하나씩 반환합니다.

따라서 Map 객체의 keys() 메서드와 values() 메서드로 반환된 값들은 이터러블 프로토콜을 준수하는 객체로 간주되어 for...of 루프와 같은 반복문에서 순회할 수 있습니다.

0개의 댓글