생성기 - 괴상한 조각

제프 포스닉
제프 포스닉

ECMAScript 6 초안 사양은 이미 현대적인 자바스크립트 개발자들에게 많은 즐거움을 선사하고 있습니다. 이전 게시물에서 몇 가지 새로운 컬렉션 클래스와 for..of 반복 루프를 다루었습니다. 이 게시물에서는 for..of 루프와 함께 사용할 수 있는 요소인 생성기 함수에 관해 살펴보겠습니다.

생성기를 사용해야 하는 이유와 방법을 설명하는 유용한 자료진행자가 이미 있습니다. 간단히 말해 생성기는 반복자를 생성하는 특수 함수이고, 반복자는 값을 얻기 위해 호출할 수 있는 next() 메서드가 있는 객체입니다. 생성기 함수 내에서 yield 키워드는 next() 값을 제공합니다. yield를 사용하면 생성기 함수의 실행을 정지하여 next()가 다시 호출될 때까지 상태를 유지합니다. 이때 코드가 다시 시작되어 다른 값을 yield할 때까지 (또는 생성기 함수가 종료될 때까지) 계속됩니다. 생성기 함수에는 여러 가지 표준 사용 사례가 있습니다. 예를 들어 피보나치 시퀀스에서 숫자를 반복하는 데 이를 사용할 수 있습니다.

기본적인 내용을 빠짐없이 살펴보고 생성기 사용과 관련된 몇 가지 실수 또는 '복잡한 부분'을 다루는 JavaScript 샘플을 자세히 살펴보겠습니다. 코드 전반에 광범위한 주석이 있으므로 코드를 읽기 전에 라이브 버전을 사용해 볼 수 있습니다.

그렇다면 코드에서 얻을 수 있는 요점은 무엇일까요?

첫째, 생성기를 구성하면 고유한 상태를 가진 고유한 반복자가 생성되며 동작을 제어할 수 있는 생성기 생성자에 매개변수를 전달할 수 있습니다.

둘째, 반복자의 next() 메서드를 호출할 때 매개변수를 전달할 수 있습니다. 그러면 이 값은 이전 반복자 호출에서 yield 문의 왼쪽에 있는 항목에 할당됩니다. 이는 반복자의 출력을 다양하게 할 수 있는 좋은 방법입니다. 여기서는 이를 사용하여 반환되는 단어가 대문자인지 여부를 제어합니다. 반환되는 첫 번째 값에 영향을 주려면 생성기의 생성자에 대한 매개변수를 통해 지정합니다.

마지막으로 생성기는 유한 반복자 또는 무한 반복자를 생성할 수 있습니다. 무한 반복자로 작업하는 경우 yielded 값을 기반으로 일종의 종결 조건이 있어야 합니다. 특히 for..of를 반복에 사용하는 경우 실수로 무한 루프를 작성하기가 매우 쉽습니다. next() 호출을 통해 유한한 반복자로 작업하는 경우 반환되는 객체의 .done 속성은 반복이 완료되었는지 여부를 알립니다.

웹에서 사용할 수 있는 다른 리소스와 함께 이 샘플이 흥미를 불러일으키고, 개발자가 자신의 코드에서 생성기를 사용할 수 있는 방법을 생각해 보는 데 도움이 되기를 바랍니다. Firefox 31 이상 버전과 Chrome 39 이상에서 생성기를 기본적으로 지원합니다. Regenerator 프로젝트는 다른 브라우저에서도 생성기 지원을 제공하며 Traceur를 사용하는 것도 가능합니다.

이 도움말을 검토하는 데 도움을 주신 에릭 아비드슨에게 감사드립니다.