on
이터러블(Iterable)
이터러블(Iterable)
728x90
<이터러블의 개념>
자바스크립트는 다른 언어와 유사하게도, 이터러블 객체의 개념이 존재한다. 이터러블 객체는 반복 가능한 객체(for ... of 등의 문법을 이용하여 각 요소를 반복할 수 있는 객체)를 의미한다.
쉽게 말해 이터러블은 Symbol.iterator 메소드를 가지고 있는 객체를 말한다. 별도로 Symbol.iterator 메소드를 정의해 주거나 프로토타입 상속을 통해서 Symbol.iterator 메소드를 갖고 있다면 Iterable Protocol의 조건을 충족하여 Iterable이라고 할 수 있다.
이터러블 객체는 for ... of 문으로 순회할 수 있고 스프레드 문법의 피연산자로 사용할 수 있다. 대표적으로 배열이 이터러블 객체에 해당된다.
ES9부터는 Object도 이터러블 객체로 활용하는 것이 가능해졌다.
const array = [1, 2, 3, 4 ,5]; console.log(Symbol.iterator in array); //true for (const item of array) { console.log(item); }
<이터레이터>
이터러블 객체의 Symbol.iterator 메서드를 호출하면 이터레이터 객체를 반환한다.
반환된 이터레이터 객체는 next 메서드를 가지고 있고, next 메서드가 호출될 때 이터레이터 리절트 객체를 반환한다면 이터레이터 프로토콜을 충족한다고 할 수 있다.
이터레이터 리절트 객체는 value와 done를 프로퍼티로 갖고 있으며, value는 현재 순회하는 값을 갖고 있고 done은 순회가 언제 끝나는지 알려준다.
next 메서드는 반복적을 호출되다가 모든 요소를 순회하게 되면 value 프로퍼티는 undefined, done 프로퍼티는 true가 되며 순회를 중단한다.
<이터러블 생성하기>
이터러블은 직접 생성하는 것도 가능하다. 먼저, 이터레이션 프로토콜에 맞춰 value와 done 프로퍼티를 반환하는 next 메서드가 반환 되도록, Symbol.iterator 메서드를 직접 작성하여 객체에 할당해주는 방법이 있다.
또한 제네레이터 함수를 이용하여 이터러블 객체를 만드는 방법도 있다. 아래는 전자의 방법을 통해 이터러블 객체를 생성한 예이다.
const range = { from: 1, to: 5 }; // Symbol.iterator 메소드 정의 (iterable 객체의 조건) range[Symbol.iterator] = function () { // iterator 객체를 반환 return { current: this.from, last: this.to, // next() 메소드 정의 (iterator 객체의 조건) next() { if (this.current <= this.last) { return { done: false, value: this.current++ }; } else { return { done: true, value: undefined }; } } }; }; // iterable 객체를 이용하는 for ... of 문법 테스트 for (const num of range) { alert(num); // 1, then 2, 3, 4, 5 }
728x90
from http://oaat9309.tistory.com/47 by ccl(A) rewrite - 2021-12-19 12:02:21