ES6에서 추가된 Iterable에 대해 학습한다.
Set
자료형에서는Array
자료형처럼[i]
번째 요소를 선택할 수 없다는걸 알았다. 그래서for
문에서 index를 순회하며 요소를 출력하면 에러가 발생했다.
그런데for-of
문은 정상적으로 동작하는걸 보고 원리가 궁금했고 Iterable을 공부해보기로 했다.
Iterable은 객체의 멤버를 반복할 수 있는 객체이다.
객체의 Symbol.iterator
속성에 특정 형태의 함수가 들어있다면, 이를 Iterable Object 혹은 줄여서 Iterable이라고 부르고, 해당 객체는 iterable protocol을 만족한다고 말한다.
Iterable protocol은 ES6에서 추가되었다.
프로그래밍 언어에서 iterator 란 배열이나 유사한 자료 구조의 내부 요소를 순회하는 객체이다. - Wiki
어떤 객체가 Iterable 이라면 아래의 기능들을 사용할 수 있다.
for-of
spread 연산자 (전개 연산자)
구조 분해 할당
const arr = [1, 2, 3, 4, 5];
// for-of
for (const a of arr) {
console.log(a); // 1 2 3 4 5
}
// spread 연산자
const spreadArr = [...arr]; // [1, 2, 3, 4, 5]
// 구조 분해 할당
const [a1, a2] = arr; // a1: 1, a2: 2
앞서 객체의 Symbol.iterator
속성에 특정 형태의 함수가 들어있다면, 이를 Iterable Object 혹은 줄여서 Iterable이라고 부른다고 했다.
그럼 Symbol.iterator
속성은 무엇일까?
const arr = [1, 2, 3, 4, 5];
const arr1 = arr[Symbol.iterator];
console.log(arr1); // [Function: values]
const arr2 = arr[Symbol.iterator]();
console.log(arr2); // Object [Array Iterator] {}
이처럼 Array
에 Symbol.iterator
속성을 찍어보면 함수가 나온다.
그 함수를 찍어보면 Iterator
라는 것이 나온다.
Iterator
란 배열이나 유사한 자료 구조의 내부 요소를 순회하는 객체라고 했다. Iterator
는 next()
라는 메서드로 객체를 순환한다.
const arr = [1, 2, 3, 4, 5];
const arr1 = arr[Symbol.iterator]();
console.log(arr1.next()); // { value: 1, done: false }
console.log(arr1.next()); // { value: 2, done: false }
console.log(arr1.next()); // { value: 3, done: false }
console.log(arr1.next()); // { value: 4, done: false }
console.log(arr1.next()); // { value: 5, done: false }
console.log(arr1.next()); // { value: undefined, done: true }
위의 예제를 통해 next()
메서드는 value와 done이라는 key를 가진 객체를 반환하는 것을 확인할 수 있다.
next()
메서드를 통해 객체를 순환할 때에는 value에는 배열의 원소가 반환되고 done은 false가 반환된다.
순환이 끝났을 경우 done에는 true가 반환된다.
for-of
문은 Iterable객체가 사용할 수 있는 기능이라고 했다.
여기까지 봤을때 for-of
문은, next()
로 객체의 내부를 순환하면서 value를 반환하고 done이 false라면 순환을 멈추는 방식이라고 유추가 가능하다.
이번 포스팅에서는 Iterator와 Iterable까지 알아볼것이다.
다음 포스팅에서는 Iterator와 엮여서 많이 나오는 Generator에 대해 알아보도록 하자