약 한달 전.. 저는 이터러블, 이터레이터에 대해 공부를 하고.. 스터디에서 발표도 진행했었습니다.
[34장 이터러블]
시작되었읍니다.. 제너레이터로 가기 이전의 첫번째 지옥열차를 탑승하신 것을 축하합니다.. 이터레이터를 들어가기 전에, 먼저 우리가 모던자바스크립트 책에서 자주 볼 수 있었던 '유사 배열
ddaeunbb.tistory.com
[Symbol.iterator]를 가지고 있으면 이터러블이고, 이를 실행해서 내뱉는건 이터레이터가 되고..
이터레이터는 이터레이터 리절트 객체를 반환하고,
리절트 객체에는 value, done이라는 프로퍼티를 가져야하고 까지는 이해했지만
이 개념을 언제 활용하는 것이 좋을까에 대한 고민을 좀 많이 했던 것 같습니다.
● 일단 결론부터
여러 블로그를 보다가 좋은 비유를 찾아내었는데, 이터레이터를 한마디로 비유하자면
이터레이터란 디스펜서다!
라고 할 수 있겠습니다..
이터레이터를 사용하면 내가 필요한 자료만, 원하는 자료의 길이만 뽑아다 쓸 수 있기 때문입니다.
이건 지연평가와도 연관이 있는데요, 내가 딱 자료가 필요한 시점에만 이터레이터는 자료를 만들어 넘겨주기 때문에 지연평가와도 연관성이 있습니다.
● 배열과 이터레이터를 비교해보자
const array = [1,2,3,4,5,6,7];
const iterator = (function(){
let num = 1;
return {
next : ()=>{
return (
num > 7 ? {done : true} : {value : num++, done: false}
)
}
}
})();
console.log(iterator.next()) // { value: 1, done: false }
console.log(iterator.next()) // { value: 2, done: false }
위의 예시를 보면 배열은 자료가 처음부터 끝까지 나열되어있고, 이터레이터는 next로 호출해야지만 자료를 가져올 수 있습니다.
이터레이터는 next 함수 하나만 지원하고 있습니다. 이터레이터에는 이전에 가져온 값 바로 다음 값만 가져올 수 있습니다.
하지만 배열같은 경우 random access가 가능합니다. 순서에 상관없이 어떤 값이든 바로 접근할 수 있죠. 그리고 배열의 요소의 총 개수도 알 수 있습니다.
따라서 요약하자면
- 이터레이터는 배열의 부분집합이 됩니다.
- 배열은 언제든지 이터레이터가 될 수 있습니다.
- 하지만 이터레이터는 배열이 되려면 모든 값을 계산해야합니다. 즉, next() 함수를 끝까지 호출해야지 배열이 될 수 있습니다.
● 계산을 하라니 불편한데요?
이터레이터가 배열이 되려면 next() 함수를 호출해야하는 이 번거로움.. 넘 귀찮지 않나요?
그런데 왜 이터레이터를 쓸까요?
1 ) More functionality does not mean 'better'.
2 ) Iterator can save memory uses.
- 늘 기능이 많다고 해서 좋은 것은 아닙니다.
- 이터레이터는 메모리 사용을 절약할 수 있습니다.
다시 아까 예제의 코드로 돌아가봅시다.
const array = [1,2,3,4,5,6,7];
const iterator = (function(){
let num = 1;
return {
next : ()=>{
return (
num > 7 ? {done : true} : {value : num++, done: false}
)
}
}
})();
위의 예시에 배열은 1부터 7까지 모두 메모리에 올려두고 있습니다. 하지만 이터레이터 같은 경우 num 변수 딱 한 개만 두고 있는 것을 알 수 있습니다. 지금은 별차이가 없어보이지만 배열의 크기가 천, 만단위이상으로 커진다면 이는 완전 다른 이야기가 됩니다.
일정한 규칙이 존재하는 수열과 같은 데이터를 다루기 위해서는 당연하게도 이터레이터를 활용하는 것이 더 좋은 선택이 될 것입니다.