ECMAScript 6 초안 사양은 이미 현대적인 자바스크립트 개발자들에게 많은 즐거움을 선사하고 있습니다. 이전 게시물에서 몇 가지 새로운 컬렉션 클래스와 for..of
반복 루프를 다루었습니다. 이 게시물에서는 for..of
루프와 함께 사용할 수 있는 요소인 생성기 함수에 관해 살펴보겠습니다.
생성기를 사용해야 하는 이유와 방법을 설명하는 유용한 자료의 진행자가 이미 있습니다. 간단히 말해 생성기는 반복자를 생성하는 특수 함수이고, 반복자는 값을 얻기 위해 호출할 수 있는 next()
메서드가 있는 객체입니다. 생성기 함수 내에서 yield
키워드는 next()
값을 제공합니다. yield
를 사용하면 생성기 함수의 실행을 정지하여 next()
가 다시 호출될 때까지 상태를 유지합니다. 이때 코드가 다시 시작되어 다른 값을 yield
할 때까지 (또는 생성기 함수가 종료될 때까지) 계속됩니다. 생성기 함수에는 여러 가지 표준 사용 사례가 있습니다. 예를 들어 피보나치 시퀀스에서 숫자를 반복하는 데 이를 사용할 수 있습니다.
기본적인 내용을 빠짐없이 살펴보고 생성기 사용과 관련된 몇 가지 실수 또는 '복잡한 부분'을 다루는 JavaScript 샘플을 자세히 살펴보겠습니다. 코드 전반에 광범위한 주석이 있으므로 코드를 읽기 전에 라이브 버전을 사용해 볼 수 있습니다.
그렇다면 코드에서 얻을 수 있는 요점은 무엇일까요?
첫째, 생성기를 구성하면 고유한 상태를 가진 고유한 반복자가 생성되며 동작을 제어할 수 있는 생성기 생성자에 매개변수를 전달할 수 있습니다.
둘째, 반복자의 next()
메서드를 호출할 때 매개변수를 전달할 수 있습니다. 그러면 이 값은 이전 반복자 호출에서 yield
문의 왼쪽에 있는 항목에 할당됩니다. 이는 반복자의 출력을 다양하게 할 수 있는 좋은 방법입니다. 여기서는 이를 사용하여 반환되는 단어가 대문자인지 여부를 제어합니다. 반환되는 첫 번째 값에 영향을 주려면 생성기의 생성자에 대한 매개변수를 통해 지정합니다.
마지막으로 생성기는 유한 반복자 또는 무한 반복자를 생성할 수 있습니다. 무한 반복자로 작업하는 경우 yield
ed 값을 기반으로 일종의 종결 조건이 있어야 합니다. 특히 for..of
를 반복에 사용하는 경우 실수로 무한 루프를 작성하기가 매우 쉽습니다. next()
호출을 통해 유한한 반복자로 작업하는 경우 반환되는 객체의 .done
속성은 반복이 완료되었는지 여부를 알립니다.
웹에서 사용할 수 있는 다른 리소스와 함께 이 샘플이 흥미를 불러일으키고, 개발자가 자신의 코드에서 생성기를 사용할 수 있는 방법을 생각해 보는 데 도움이 되기를 바랍니다. Firefox 31 이상 버전과 Chrome 39 이상에서 생성기를 기본적으로 지원합니다. Regenerator 프로젝트는 다른 브라우저에서도 생성기 지원을 제공하며 Traceur를 사용하는 것도 가능합니다.
이 도움말을 검토하는 데 도움을 주신 에릭 아비드슨에게 감사드립니다.