러닝 자바스크립트 스터디 자료 - CHAPTER 12. 이터레이터와 제너레이터

이터레이터

이터레이터는 ‘지금 어디있는지’ 파악할 수 있도록 돕는다는 면에서 일종의 책갈피와 비슷한 개념이다. 배열은 이터러블 객체의 좋은 예이다. 책에 여러 페이지가 있는 것처럼 배열에는 여러 요소가 들어 있으므로 책에 책갈피를 끼울수 있듯 배열에는 이터레이터를 사용 할 수 있다.

next메서드는 더이상 진행 할것이 없으면 undefined가 되지만 next는 계속 호출 할 수 있습니다.
물론 그렇다고 결과가 바뀌는건 아니다.

이터레이터는 모두 독립적입니다. 즉 새 이터레이터를 만들 때마다 처음에서 시작합니다.
그리고 각각 다른 요소를 가리키는 이터레이터 여러 개를 동시에 사용할 수도 있습니다.

이터레이션 프로토콜

이터레이터는 그 자체로 크게 쓸모가 있다기보다는 더 쓸모 있는 동작이 가능해지도록 한다는데 의미가 있다.
이터레이터 프로토콜은 모든 객체를 이터러블 객체로 바꿀 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
class Log {
constructor(){
this.messages = [];
}
add(message){
this.messages.push({ message, timestamp: Date.now() });
}
[Symbol.iterator](){
return.this.messages.valus();
}
}

이터레이션 프로토콜은 클래스에 심볼 메서드 Symbol.iterator가 있고 이 메서드가 이터레이터처럼 동작하는 객체, 즉 value와 done프로퍼티가 있는 개체를 반환하는 next메서드를 가진 객체를 반환한다면 그 클래스의 인스턴스는 이터러블 객체라는 뜻입니다.

제너레이터

제너레이터란 이터레이터를 사용해 자신의 실행을 제어하는 함수입니다. 일반적인 함수는 매개변수를 받고 값을 반환하지만 호출자는 매개변수 외에는 함수의 실행을 제어할 방법이 전혀 없습니다.
함수를 호출하면 그 함수가 종료될 때까지 제어권을 완전히 넘기는 겁니다. 하지만 제너레이터에서는 그렇지 않다.

제너레이터의 도입된 새로운 개념

제너레이터는 언제든 호출자에게 제어권을 넘길 수 있습니다.
제너레이터는 호출한 즉시 실행되지는 않습니다. 대신 이터레이터를 반환하고, 이터레이터의 next 메서드를 호출함에 따라 실행됩니다.

이 두가지 예외를 제외하면 일반적인 함수와 같습니다.

제너레이터를 만들때는 function키워드 뒤에 애스터리스크(*)를 붙입니다.
제너레이터에서는 return 외에 yield 키워드를 쓸 수 있습니다.

yield 표현식과 양방향통신

통신은 yield 표현식을 통해 이뤄진다.
표현식은 값으로 평가되고 yield는 표현식이므로 반드시 어떤 값으로 평가 됩니다.
yield표현식의 값은 호출자가 제너레이터의 이터레이터에서 next를 호출할 때 제공하는 매개변수 입니다.

제너레이터를 시행했을 때 일어나는 일을 묘사한것 책 참고

제너레이터와 return

yield문은 설령 제너레이터의 마지만 문이더라도 제너레이터를 끝내지 않습니다.
제너레이터에서 return문은 사용하면 그 위치와 관계없이 done은 true가 되고, value 프로퍼티는 return이 반환하는 값이 됩니다.

제너레이터에서 중요한 값을 return으로 반환하려 하지 마십시오.
제너레이터가 반환하는 값을 사용하려 할 때는 yield를 써야 하고 return은 제너레이터를 중간에 종료하는 목적으로만 사용해야 합니다.

요약

이터레이터는 배열이나 객체처럼 여러 가지 값을 제공할 수 잇는 컬렉션의 동작 방식을 표준화했습니다.
이터레이터로 할 수 있는 일은 ES6 이전에도 모두 할 수 있었으므로 어떤 기능이 추가된 것은 아니다.
중요하면서도 자주 사용하는 패턴을 표준화했다는데 의미가 있다.

제너레이터를 사용하면 함수를 훨씬 더 유연하고 효율적으로 사용 할 수 있다.
제너레이터는 모든 연산을 지연시켰다가 필요할 때만 수행하게 만들 수 있다.

댓글

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×