ECMAScript 2015
by jbee
[ES6] 9. Iterator
Iterator
 iterator 는순회가능한값들의 시퀀스 를만드는방법을정의한다.
대표적인순회가능한것은 Array 다.  Array 오브젝트는
 Symbol.iterator 를가지고 있다.
let arr = [1, 2, 3];
console.log(typeof arr[Symbol.iterator]);// function
next
위예제코드에서정의한 arr 의 iterator 를추출하여 arr 를순회할수
있다.
let iterator = arr[Symbol.iterator]();
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}
value, done
 iterator 를추출하자마자 head (공식용어는아니고 설명을위한용어)는
배열의시작점을가리키게 된다.(첫원소를가리키는것이아니다.) 그 상태에
서 next() 메소드를호출하게 되면, 첫번재원소가 출력된다. 출력값은원소
의값인 value 와 done 이라는 boolean 값을가지고 있는 Object 이
다. 마지막원소까지출력된상태에서 next() 메소드를호출하게 되면
 value 는 undefined 가 되고  done 값은 true 가 된다.
 iterable 프로토콜
문자열에도적용할수있다.  String 오브젝트도 iterable 프로토콜을구
현한오브젝트이기 때문에 iterator 를사용할수있는것이다.
let name = "jbee";
let iterator = name[Symbol.iterator]();
console.log(iterator.next());// {value: j, done: false}
console.log(iterator.next());// {value: b, done: false}
console.log(iterator.next());// {value: e, done: false}
console.log(iterator.next());// {value: e, done: false}
console.log(iterator.next());// {value: undefined, done: true}
 iterable 프로토콜
 Object 에는기본적으로 iterator 가 존재하지않는다. 때문에 for-
of 로순회할수없다. 하지만 iterator 를오브젝트에추가하여
 iterable 하게 만들수있다. 또한배열을상속받은객체는 iterable 객
체이므로 iterator 를사용할수있다.
 iterable 프로토콜
 iterator 를사용하다보면뭔가 Java의 interface 또는
 @FunctionalInterface 같은느낌도든다. java에서해당
 interface 를 implements 하게 되면해당기능을사용할수있는것처럼
구현하고자하는 Symbol , 즉 iterator 를프로퍼티에추가해서사용하면
 iterator 기능을사용할수있는것이다.
어떻게 하면 iterator 를그럴싸하게 사용해볼수있을까?
다음예제는이렇게 사용하면어떨까? 정도의예제코드이다. 가볍게 보고 넘
어가자.
// Object to create id
let autoIncrement = {
[Symbol.iterator]() {
let id = 0;
return {
next() {
return {
value: ++id,
done: false
}
}
}
}
}
// Define User class
class User {
constructor(id, name) {
this.id = id;
this.name = name;
}
}
const idCreator = autoIncrement[Symbol.iterator]();
console.log(new User(idCreator.next().value, "jbee"));// { id:
console.log(new User(idCreator.next().value, "foo"));// { id: 2
console.log(new User(idCreator.next().value, "bar"));// { id: 3
 autoIncraement 객체에 iterator 프로퍼티를추가하여,  id 를순차적
으로생성하게 만들었다.  id 에대해서는외부에서접근할수없으므로안정
적인 id 가 생성될수있지않을까?
9.end

[ES6] 9. Iterator