์ดํฐ๋ ์ด์
8/12/2022
์์ฑ์ : ํ์๋ฐฐ
์ดํฐ๋ฌ๋ธ
- ๋ฐ์ดํฐ๋ฅผ ์ํํ ์ ์๋ ๊ฐ์ฒด๋ก for.. of ๋ฌธ์ด๋ ์คํ๋ ๋ ๋ฑ์ ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค
- ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ [Symbol.iterator]() ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด
- [Symbol.iterator]๋ผ๋ Symbol๊ฐ์ ํค๋ก ์ค์
ย
Symbol
- Symbol.iterator๋ Symbol ์์ฑ์ํจ์์ ์ ์ ๋ฉ์๋์ด๋ฉฐ well-known Symbol ๊ฐ์ด๋ค
- Well-known Symbol์ธ Symbol.iterator ๋ฉ์๋๋ฅผ ํ๋กํผํฐ ํค ๊ฐ์ผ๋ก ๊ฐ์ง๊ณ ์์ผ๋ฉด ์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ์ดํฐ๋ฌ๋ธ๋ก ๋์ํ๋ค
์ ์ญ Symbol์ ๋ง๋ค๊ธฐ ์ํด์๋ Symbol.for()๋ก ๋ง๋ค์ด์ผ ํ๋ฉฐ ์ผ๋ฐ Symbol ์์ฑ์๋ก ๋ง๋๋ ์ธ์คํด์ค๋ ์ค๋ช
์๋ฅผ ๋ฃ์ ๊ฒ์ผ ๋ฟ์ด๋ค
ย
//์ดํฐ๋ฌ๋ธ const iterable =['a','b','c'] //์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค const iterator = iterable[Symbol.iterator](); console.log(iterator.next()); // { value: 'a', done: false } console.log(iterator.next()); // { value: 'b', done: false } console.log(iterator.next()); // { value: 'c', done: false } console.log(iterator.next()); // { value: undefined, done: true }
ย
ย
์ดํฐ๋ ์ดํฐ
{value: ๊ฐ, done: true/false} ํํ์ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ next() ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด
ย
//์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด const iterable = ['a','b','c']; console.dir(iterable); // => Symbol.iterator๊ฐ key๊ฐ ๋ ํ๋กํผํฐ๊ฐ ์๋ค iterable[Symbol.iteartor](); //=> Iterator {} ๊ฐ์ฒด ๋ฐํ // iterator๋ next method๋ฅผ ๊ฐ์ง๋ค // next method๋ {value, done}์ ํค๋ก ๊ฐ์ง๋ค
ย
์ ๋๋ ์ดํฐ
- ES6์์ ๋์ ๋ ์ ๋๋ ์ดํฐ ํจ์๋ ์ดํฐ๋ฌ๋ธ์ ์์ฑํ๋ ํจ์
- ์ดํฐ๋ฌ๋ธ์ด๋ฉด์ ๋์์ ์ดํฐ๋ ์ดํฐ์ธ ๊ฐ์ฒด
// ์ดํฐ๋ฌ๋ธ์ด๋ฉด์ ๋์์ ์ดํฐ๋ ์ดํฐ const createInfinityByIteration = function () { let i = 0; // ์์ ๋ณ์ return { [Symbol.iterator]() { return this; }, //=> ์๊ธฐ์์ ์ ๋ฐํํด์ผ์ง, ์ฌํ๊น์ง์ ๋ฐ๋ณต๋ ์งํ์ํฉ์ ๊ธฐ์ตํ๋ค next() { return { value: ++i }; } }; }; // ๋ฌดํ ์ดํฐ๋ฌ๋ธ์ ์์ฑํ๋ ํจ์ const infiniteFibonacci = (function () { let [pre, cur] = [0, 1]; return { [Symbol.iterator]() { return this; }, next() { [pre, cur] = [cur, pre + cur]; // done ํ๋กํผํฐ๋ฅผ ์๋ตํ๋ค. return { value: cur }; } }; }()); // infiniteFibonacci๋ ๋ฌดํ ์ดํฐ๋ฌ๋ธ์ด๋ค. for (const num of infiniteFibonacci) { if (num > 10000) break; console.log(num); // 1 2 3 5 8... } // ์ ๋๋ ์ดํฐ๋ฅผ ์ด์ฉํ๋ค๋ฉด... // ๋ฌดํ ์ดํฐ๋ฌ๋ธ์ ์์ฑํ๋ ์ ๋๋ ์ดํฐ ํจ์ const createInfiniteFibByGen = function* (max) { let [prev, curr] = [0, 1]; while (true) { [prev, curr] = [curr, prev + curr]; if (curr >= max) return; // ์ ๋๋ ์ดํฐ ํจ์ ์ข ๋ฃ yield curr; } }; for (const num of createInfiniteFibByGen(10000)) { console.log(num); }
ํจ์๋ฅผ ํ๋ฒ์ ๋ค ์คํํ์ง ์๊ณ ์ผ์ ์ค์งํ๋ค๊ฐ ํ์ํ ์์ ์ ๋ค์ ์คํํ๋ค
์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์ ์ค์ํด์ ์ดํฐ๋ฌ๋ธ์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๊ฐํธํ๊ฒ ๊ตฌํํ ์ ์๋ค
์ค์ฌ์ฉ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์ฌ์ฉํ ์ ์๋ค. ์ํ ๋ ํจ์์ ๋์์ ๋ฉ์ถ๊ณ ํ์ํ ๋ ๋ค์ ์ค๋จ์ ๋ถํฐ ์์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
But, ๋น๋๊ธฐ์ฒ๋ฆฌ๋ ES7์์ ๋น๋๊ธฐํจ์์์ ๋ ๊ฐ๋
์ฑ ์๊ฒ ์ฌ์ฉํ ์ ์๋ค
ย
ย
์ ๋ฆฌ
์ดํฐ๋ฌ๋ธ์ด๋?
์ดํฐ๋ฌ๋ธ ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ฐ์ฒด
๋ฐ์ดํฐ๋ฅผ ์ํํ๊ธฐ ์ํ ES6 ํต์ผ๋ ๊ท์ฝ์ด๋ผ๊ณ ํ ์ ์๊ณ
Symbol.iteartor๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค
ย
์ดํฐ๋ ์ดํฐ๋?
value, done์ด๋ผ๋ ํค๋ฅผ ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ next๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ผ๊ณ ํ ์ ์์ต๋๋ค
ย
์ ๋๋ ์ดํฐ
์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํจ์
์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ์ดํฐ๋ ์ด์
ํ๋กํ ์ฝ์ ์ค์ํ๋ฉด์ ๊ฐํธํ๊ฒ ๋ง๋ค์ ์๋ ํจ์
์ดํฐ๋ฌ๋ธ์ด๋ฉด์ ์ดํฐ๋ ์ดํฐ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค
ย
arguments, NodeList, HTMLCollection ์ ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด์ด๊ธฐ์ length๋ฅผ ํตํด ์ํํ๋ ๋ฐฉ๋ฒ(for โฆ in)๋ ๊ฐ๋ฅํ์ง๋ง ๋์์ ์ดํฐ๋ฌ๋ธ์ ์ง์ํ๋ค (for โฆ of)
์ฐธ์กฐ
ย