๐ถ๐ป์์ํ๊ธฐ ์ ์
์ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ดํฐ๋ ์ดํฐ๋ผ๋ ๊ฐ๋ ์ ์ ํ์ ๋ '์ด๋ ต๋ค' ๋ผ๊ณ ์๊ฐํ๋ ๊ธฐ์ต์ด ์์ต๋๋ค. [Symbol.iterator] ๋ผ๋ ๊ฒ์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค๋๋ฐ ์ ๊ฒ ๋ฌด์จ ๋ฌธ๋ฒ์ธ์ง ๋ชจ๋ฅด๊ฒ ๊ณ , ํผ๋์ค๋ฌ์ ๋ ๊ธฐ์ต์ด ์์ต๋๋ค. ์ค๋์ ์ ๋๋ ์ดํฐ์ ๋ํด ์นผ๋ผ์ ์์ฑํ๊ธฐ ์ด์ ์ ์ดํฐ๋ ์ดํฐ ๊ฐ๋ ์ ๋ํด ์กฐ๊ธ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋ ๊ธ์ ์์ฑํด ๋ณด๊ณ ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ผ๋ ํจ๊ป ๊ฐ๋ด ์๋ค!
ES6์ ์ดํฐ๋ฌ๋ธ
์๋ฐ์คํฌ๋ฆฝํธ์์ ES6 ์ด์ ์ ์ํ ๊ฐ๋ฅํ ์๋ฃ๊ตฌ์กฐ๋ค์ ํต์ผ๋ ๊ท์ฝ ์์ด ๊ฐ์ ๋๋ฆ์ ๋ ๋ฆฝ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์ํ๋ฅผ ํ์์ต๋๋ค. ES6 ์์๋ ์ํ ๊ฐ๋ฅํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ”์ดํฐ๋ฌ๋ธ"๋ก ํต์ผํ์ฌ ์ผ์ํ ํ์๊ณ , ๊ทธ๋ฆฌํ์ฌ for…of ๋ฌธ, ์คํ๋ ๋ ๋ฌธ๋ฒ, ๋ฐฐ์ด ๋์คํธ๋ญ์ฒ๋ง ํ ๋น์ ๋์์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํ์์ต๋๋ค.
์ดํฐ๋ฌ๋ธ๊ณผ ์ดํฐ๋ ์ด์ ๊ทธ๋ฆฌ๊ณ ์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ
๊ฐ๋จํ๊ฒ ๋งํด ์ดํฐ๋ฌ๋ธ๊ณผ ์ดํฐ๋ ์ดํฐ๋ ๊ฐ์ฒด์ ๋๋ค. ๊ทผ๋ฐ ๊ทธ๋ฅ ๊ฐ์ฒด๊ฐ ์๋๋ผ ์ํ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋๋ก ํ๊ธฐ ์ํด ํน์ ํ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋๋ก ๋ง๋ ๊ฐ์ฒด์ด์ฃ . ๊ทธ๋ฆฌ๊ณ ์ด๋ค ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ผ '์ด๋ฌ๋ฌ๋ธ', '์ดํฐ๋ ์ดํฐ' ๋ผ๊ณ ๋ถ๋ฅผ ์ ์๋์ง ๊ท์ฝ์ผ๋ก ์ ํด ๋์์ต๋๋ค. ์ด ๊ท์ฝ์ด๋ผ๋ ๊ฒ์ ๊ฐ๋จํ๊ฒ ๋งํด '์ด๋ ํ ํจ์๋ฅผ ๊ตฌํํ๊ณ , ์ด๋ ํ ๊ฐ์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค' ๋ผ๊ณ ์ ํด๋์ ์ฝ์์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ฝ์์ ์ฐ๋ฆฌ๋ "์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ" ๊ณผ "์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ"์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ก ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๊ฐ์ฒด๊ฐ ์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ์ ๊ตฌํํ๋ค๋ผ๋ ๊ฒ์ ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ๊ตฌํํ๊ณ ์๋ ๊ฒ์ ๋๋ค.
์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ
์ด๋ ํ ๊ฐ์ฒด๊ฐ ์ดํฐ๋ฌ๋ธ์ด ๋๊ธฐ ์ํด์๋ (1) [Symbol.iterator]๋ฅผ ๊ฐ์ฒด ๋ด์ key๋ก ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ฉฐ (2) [Symbol.iterator]() ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
const iterableObj = {
Symbol.iterator: function() {
return iteratorObj
}
}
์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด์ง์. Symbol.iterator๋ ๊ฐ์ฒด์ key์ด๋ฉฐ ๋๊ดํธ ํ๊ธฐ๋ฒ์ผ๋ก ๊ฐ์ฒด์ ํค์ ์ ๊ทผํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ํค์ value๋ก๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ์, ์ด ๋ฉ์๋๋ ์คํ์ iterator ๋ฅผ ๋ฐํํ๋ ํจ์์ ๋๋ค.
์ ๋ฆฌํ๋ฉด ์ดํฐ๋ฌ๋ธ์ด๋ Symbol.iterator ๋ผ๋ ํค์ ์ดํฐ๋ฌ๋ธ์ ๋ฐํํ๋ ํจ์๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด์ ๋๋ค. ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ ์ด๋ฐ ์กฐ๊ฑด์ ๊ฐ์ถ์ด์ผ ํ๊ณ ์ด๋ฅผ ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ด๋ผ ๋ถ๋ฅด๋ ๊ฒ์ด์ง์.
์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ
๋ฐ๋ก ์ ์์ ์์ ์ดํฐ๋ฌ๋ธ์ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ๊ฐ์ผ๋ก ํ๋ Symbol.iterator ๋ผ๋ ํค๊ฐ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด์์ ์์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฐํ๋๋ ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด๋ next() ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด next() ๋ฉ์๋๋ฅผ ์คํํ๋ฉด IteratorResult ๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. IteratorResult ๊ฐ์ฒด๋ value์ done ์ด๋ผ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด ์ํ์ด ๋๋ฌ๋์ง๋ฅผ ์ ์ ์๊ฒ ํฉ๋๋ค.
์ดํฐ๋ฌ๋ธ ๋์ผ๋ก ํ์ธํ๊ธฐ
์ง๊ธ๊น์ง ์ดํฐ๋ฌ๋ธ, ์ดํฐ๋ ์ดํฐ๊ฐ ๋๊ธฐ ์ํด ๊ฐ์ถ์ด์ผ ํ ์กฐ๊ฑด์ ๋ํด ์์๋ณด์์ต๋๋ค. ์ถ์์ ์ด๊ฒ ๋๊ปด์ง๋์? ์ด๋ฒ์๋ ๋์ผ๋ก ํ์ธํ๋ฉฐ ์กฐ๊ธ ๋ ์ง๊ด์ ์ผ๋ก ์ดํดํด ๋ณด๊ฒ ์ต๋๋ค.
//(1)
const iteratorFn = Array.prototype[Symbol.iterator];
console.log(iteratorFn); //[Function: values]
//(2)
const iteratorObj = Array.prototype[Symbol.iterator]();
console.log(iteratorObj); //Object [Array Iterator] {}
์๋ฐ์คํฌ๋ฆฝํธ์ ๋นํธ์ธ ๊ฐ์ฒด์ธ Array๋ ์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ์ ๊ตฌํํฉ๋๋ค. ์ฆ, ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๋ฐฐ์ด์ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด์ ๋๋ค. ์ ์์ ๋ฅผ ํตํด [Symbol.iterator] ๋ ํจ์์ด๋ฉฐ [Symbol.iterator]()๋ ๊ทธ ํจ์๋ฅผ ์คํํ ๊ฒ์ด์ฃ . ๊ทธ ๊ฒฐ๊ณผ ๋ณ์ iteratorFn ์๋ ํจ์๊ฐ ํ ๋น๋๋ฉฐ, iteratorObj ์๋ ์ด ํจ์๋ฅผ ์คํํ์ฌ ๋ฐํ๋ ์ดํฐ๋ ์ดํฐ๊ฐ ํ ๋น๋์ฃ . ๋ฌผ๋ก iteratorObj ๋ next() ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๊ฒ ์ง์?
Iterator ์ฌ์ฉํด ๋ณด๊ธฐ
const arr = [1, 2, 3];
const iteratorObject = arr[Symbol.iterator]();
//(1) next(...args: [] | [TNext]): IteratorResult<T, TReturn>;
console.log(iteratorObject.next()); //{ value: 1, done: false }
console.log(iteratorObject.next()); //{ value: 2, done: false }
console.log(iteratorObject.next()); //{ value: 3, done: false }
console.log(iteratorObject.next()); //{ value: undefined, done: true }
์ ์์ ์์๋ ์ดํฐ๋ ์ดํฐ๊ฐ ๊ฐ์ง๊ณ ์๋ next() ๋ฉ์๋๋ฅผ ํ์ฉํด์ ๊ฐ์ ์ํํด ๋ณด์์ต๋๋ค. ์ฃผ์์ผ๋ก ์ฒ๋ฆฌ๋ ๋ถ๋ถ์ ๋ณด์๋ฉด next() ๋ฉ์๋๋ IteratorResult๋ฅผ ๋ฐํํฉ๋๋ค.( ์ ๋ค๋ฆญ๊ณผ ํ์ ์คํฌ๋ฆฝํธ์ ์ต์ํ์ง ์๋ค๋ฉด ๋์ด๊ฐ๋ ์ข์ต๋๋ค. ) ์ด๋ ๊ฒ ๋ฐํ๋ ๊ฐ์ฒด๋ value์ done์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ for...of ์ ๊ฐ์ด ์ดํฐ๋ ์ดํฐ๋ฅผ ํ์ฉํด์ ๊ฐ์ ์ํํ๋ ๋ฌธ๋ฒ์ ์ด๋ฅผ ์ด์ฉํด ๊ฐ์ ์ํํ ์ ์์ต๋๋ค.
for...of ๋ ์ด๋ป๊ฒ ๋์ํ ๊น?
const array = [1,2,3];
const iterator = array.values(); //values(): IterableIterator<T>;
while (true) { //(1)
const item = iterator.next();
if (item.done) break;
console.log(item.value); // 1 2 3
}
for (let item of array) { //(2)
console.log(item);
}
for of๋ฌธ์ ์๋ง๋ ๋ด๋ถ์ ์ผ๋ก (1)๊ณผ ๊ฐ์ด ๊ตฌํ๋์ด ์์ผ๋ฆฌ๋ผ ์ถ์ธกํด ๋ณผ ์ ์์ต๋๋ค. done์ด true๊ฐ ๋ ๋๊น์ง value๋ฅผ ์ํํฉ๋๋ค. ์ด๋ (2)์ ๋์ผํฉ๋๋ค. ์ดํฐ๋ ์ดํฐ์ next() ๋ฉ์๋์ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ธ IteratorResult ๊ฐ์ฒด๋ฅผ ํ์ฉํด์ ์ํ๋ฅผ ํ๊ณ ์์ต๋๋ค.
์ ๋ฆฌํฉ์๋ค.
์ดํฐ๋ฌ๋ธ, ์ดํฐ๋ ์ดํฐ์ ๋ํด ๊ฐ๋จํ ์์๋ณด์์ต๋๋ค. ์ฝ๊ฒ ํต์ฌ๋ง ์ ๋ฌํ๋๋ฐ ์ด์ ์ ๋ง์ถ์๊ธฐ์, ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ ์์ธํ ๊ธ์ ์ฐพ์๋ณด์๋ฉด ์ดํดํ๋๋ฐ ๋์์ด ๋๋ฆฌ๋ผ๋ ์๊ฐ์์ ๊ธ์ ๊ฒฐ์ฌํ๊ฒ ๋์์ต๋๋ค. ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค : )
๋๊ธ