- 아래와 같이 작성을 하면 시간 초과로 효율성 테스트 케이스를 통과하지 못한다.
const stack = []
for(let i in arr) {
if(stack[stack.length - 1] !== arr[i]) {
stack.push(arr[i])
}
}
- 하지만 아래처럼 수정을 하면, 효율성 테스트를 모두 통과한다.
const stack = []
for(let i = 0; i < arr.length; i++) {
if(stack[stack.length - 1] === arr[i]) {
continue
}
stack.push(arr[i])
}
어떤 차이점이 존재하는 것일까?
- 우선 첫번째 경우, for in 구문을 사용하게 되면, 배열을 순회하기 위해 이터레이터를 호출하게 된다.(순회 중 뒤에 어떤 원소가 올지 알 수가 없기 때문에 이터레이터를 통한 순회가 필요하다.) 예를 들어 5개의 원소를 순회한다고 하면, 다음 값이 무엇인지 알기 위해 이터레이터를 총 5번 호출하게 되고 next().value를 실행한다. 그리고 순회가 모두 완료되면 호출하지 않게 된다. 이때 이터레이터를 5번 호출로 인한 오버로드가 발생하여 시간이 초과된 것이다.
- 두번째 같은 경우에는 i라는 변수를 메모리에 할당시키고, 1씩 증가시키며 배열의 인덱스에 순차적으로 접근한다. 따라서 위와 같은 오버로드가 발생하지 않게 된다.
그럼 이터레이터와 제너레이터의 존재 의의는?
- 존재 의의 중 하나는 함수형 프로그래밍을 위한 것이다. 여러 줄로 된 코드를 깔끔한 하나의 코드로 작성하는 것이 가능하기 때문이다.
ex) 배열의 map,filter 함수는 이터레이터를 호출하게 된다.