프론트엔드 개발 · 심화
JavaScript의 이터레이터(Iterator)와 제너레이터(Generator)에 대해 설명해주세요.
힌트 · Symbol.iterator, next(), yield 키워드를 설명해보세요.
이터레이션 프로토콜next()doneyield상태 관리
모범답안
면접관님, JavaScript의 이터레이터와 제너레이터에 대해 설명드리겠습니다.
이터레이터는 이터레이션 프로토콜을 따르는 객체입니다. 이터레이션 프로토콜은 next() 메서드를 통해 순차적으로 값에 접근하는 방식을 정의합니다. next() 메서드는 { value: 값, done: 완료여부 } 형태의 객체를 반환합니다. done이 true가 되면 순회가 종료됩니다.
제너레이터는 이터레이터를 생성하는 함수입니다. 함수 내부에 yield 키워드를 사용하여 값들을 순차적으로 반환할 수 있습니다. 제너레이터 함수를 호출하면 이터레이터 객체가 반환되고, next() 메서드를 호출할 때마다 yield 키워드에서 값을 반환하며 함수 실행이 일시 중단됩니다. 제너레이터는 내부 상태를 유지하기 때문에 복잡한 이터레이션 로직을 간결하게 구현할 수 있다는 장점이 있습니다.
예를 들어, 다음과 같은 제너레이터 함수를 만들 수 있습니다.
function* numberGenerator() {
yield 1;
yield 2;
yield 3;
}
const iterator = numberGenerator();
console.log(iterator.next()); // { value: 1, done: false }
이처럼 제너레이터는 이터레이터를 쉽게 생성하고 관리할 수 있도록 도와주는 강력한 기능입니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 JavaScript 면접 질문
- JavaScript의 debounce와 throttle의 차이점과 사용 사례를 설명해주세요.
- JavaScript의 실행 컨텍스트(Execution Context)와 스코프 체인에 대해 설명해주세요.
- JavaScript의 WeakMap과 WeakSet의 특징과 사용 사례를 설명해주세요.
- JavaScript의 Proxy와 Reflect의 용도와 사용법에 대해 설명해주세요.
- for 루프 안에서 setTimeout 콜백이 모두 같은 값을 출력하는 고전적인 문제를 var로 작성했을 때 왜 발생하는지, 그리고 let으로 바꾸면 왜 의도대로 동작하는지를 블록 스코프와 클로저 캡처 관점에서 설명해주세요.
- 메모이제이션 캐시나 카운터를 클로저로 구현할 때, 시간이 지나면서 의도치 않게 메모리가 계속 점유되는 상황이 생길 수 있습니다. 클로저가 참조를 붙잡는 방식이 GC와 어떻게 상호작용하는지, 그리고 이를 어떻게 완화할 수 있을지 설명해주세요.