이터레이터와 제너레이터 (Iterator & Generator)
제너레이터(Generator)는 함수의 실행을 도중에 멈추고(`yield`), 나중에 다시 재개할 수 있는 특별한 함수입니다. 함수 이름 앞에 function* 을 붙여 만듭니다.
일반 함수는 호출되면 끝까지 실행되지만, 제너레이터는 호출하면 곧바로 실행되지 않고 이터레이터(Iterator) 객체를 반환합니다. 이 객체의 next() 메서드를 호출할 때마다 다음 yield를 만날 때까지만 실행되고 일시 정지됩니다. 무한한 데이터 스트림을 다루거나 비동기 로직을 동기적으로 보이게 제어할 때 사용됩니다.
<script>
console.log("=== 제너레이터 기초 ===");
// 별표(*)가 붙은 제너레이터 함수
function* idMaker() {
console.log("아이디 생성 시작!");
let index = 1;
while (index <= 3) {
// yield를 만나면 실행을 멈추고 값을 바깥으로 던짐(반환)
yield index++;
}
return "완료";
}
// 호출해도 즉시 실행되지 않고 제어용 '이터레이터' 객체만 반환됨
const gen = idMaker();
// next()를 호출해야 비로소 함수 내부가 실행됨
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: "완료", done: true }
console.log("\n=== 무한 제너레이터 (메모리 낭비 없음) ===");
function* infiniteCounter() {
let i = 0;
while (true) {
yield i++; // 필요할 때만 호출하므로 무한 루프라도 브라우저가 뻗지 않음!
}
}
const counter = infiniteCounter();
console.log("첫번째:", counter.next().value); // 0
console.log("두번째:", counter.next().value); // 1
console.log("필요할 때마다 하나씩 뽑아 쓸 수 있습니다.");
</script>