javascript 이터레이터

민순기·2022년 1월 5일
0

Goal

ES6에서 추가된 Iterable에 대해 학습한다.

Why

Set자료형에서는 Array자료형처럼 [i]번째 요소를 선택할 수 없다는걸 알았다. 그래서 for문에서 index를 순회하며 요소를 출력하면 에러가 발생했다.
그런데 for-of문은 정상적으로 동작하는걸 보고 원리가 궁금했고 Iterable을 공부해보기로 했다.

Iterable

Iterable은 객체의 멤버를 반복할 수 있는 객체이다.

객체의 Symbol.iterator 속성에 특정 형태의 함수가 들어있다면, 이를 Iterable Object 혹은 줄여서 Iterable이라고 부르고, 해당 객체는 iterable protocol을 만족한다고 말한다.

Iterable protocol은 ES6에서 추가되었다.

프로그래밍 언어에서 iterator 란 배열이나 유사한 자료 구조의 내부 요소를 순회하는 객체이다. - Wiki

Iterable의 사용

어떤 객체가 Iterable 이라면 아래의 기능들을 사용할 수 있다.

  • for-of
  • spread 연산자 (전개 연산자)
  • 구조 분해 할당

Example

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

Iterator

앞서 객체의 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] {}

이처럼 ArraySymbol.iterator 속성을 찍어보면 함수가 나온다.
그 함수를 찍어보면 Iterator라는 것이 나온다.

Iterator 란 배열이나 유사한 자료 구조의 내부 요소를 순회하는 객체라고 했다. Iteratornext()라는 메서드로 객체를 순환한다.

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() 메서드는 valuedone이라는 key를 가진 객체를 반환하는 것을 확인할 수 있다.

next() 메서드를 통해 객체를 순환할 때에는 value에는 배열의 원소가 반환되고 donefalse가 반환된다.

순환이 끝났을 경우 done에는 true가 반환된다.

for-of문은 Iterable객체가 사용할 수 있는 기능이라고 했다.
여기까지 봤을때 for-of문은, next()로 객체의 내부를 순환하면서 value를 반환하고 donefalse라면 순환을 멈추는 방식이라고 유추가 가능하다.

Done

이번 포스팅에서는 IteratorIterable까지 알아볼것이다.
다음 포스팅에서는 Iterator와 엮여서 많이 나오는 Generator에 대해 알아보도록 하자

profile
2년차 FE 개발자 민순기입니다.

0개의 댓글