이터레이터(Iterator)는 자바스크립트의 컬렉션(배열, 맵, 셋 등)을 순회하고 값을 하나씩 가져오는 데 사용되는 기능이다. 이터레이터는 순회 가능한 객체에서 값을 반복적으로 가져오는 방법을 제공하여 반복 작업을 간편하게 처리할 수 있도록 도와준다.
이터레이터를 이해하기 위해서는 먼저 "순회 가능한(iterable)" 개념을 알아야 한다. 순회 가능한 객체는 Symbol.iterator
라는 특별한 메서드를 가지고 있으며, 이 메서드는 이터레이터를 반환한다. 이터레이터는 { value, done }
형태의 객체를 반환하는 next()
메서드를 가지고 있다. 자바스크립트에서는 이러한 Iterator 기능을 보다 직관적으로 사용할 수 있도록 Generator Function 기능을 제공한다.
Generator 함수는 함수 실행을 중간에 멈추고 다시 시작할 수 있는 특별한 종류의 함수이다. 일반적인 함수는 호출되면 처음부터 끝까지 실행되고 결과값을 반환하며 종료되지만, Generator 함수는 실행 중간에 값을 반환하고 함수를 일시 중단한 다음, 다시 재개할 수 있다.
function* idMaker(){
var index = 0;
while(index < 3)
yield index++;
}
var gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // undefined
이때, 일시 중지된 상태에서는 컨텍스트(변수 값)은 출입 과정에서 저장된 상태로 남아있다. Generator
함수는 호출되어도 즉시 실행되지 않고, 대신 함수를 위한 Iterator
객체가 반환된다.
Interator
의 next()
메서드를 호출하면 Generator 함수가 실행되어 yield
문을 만날 때까지 진행하고, 이후 next()
메서드가 호출되면 진행이 멈췄던 위치에서부터 재실행한다.
next()
가 반환하는 객체는 yield
문이 반환할 값(yielded value)을 나타내는 value
속성과, Generator 함수 안의 모든 yield
문의 실행 여부를 표시하는 boolean
타입의 done
속성을 갖는다.
next()
를 인자 값과 함께 호출할 경우, 진행을 멈췄던 위치의 yield
문을 next()
메서드에서 받은 인자 값으로 치환하고 그 위치에서 다시 실행하게 된다.
Generator 함수는 비동기 처리에 유용하게 사용될 수 있으며, 복잡한 순환 로직이나 데이터 처리에도 효과적으로 적용될 수 있다. Iterator와 Generator는 자바스크립트의 다양한 상황에서 편리하게 활용되는 기능이기에 숙지하도록 하자.