
์ดํฐ๋ฌ๋ธ(Iterable)
์ ์
- ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฐ์ฒด
- `for...of`, `์คํ๋ ๋(...)`, `๋์คํธ๋ญ์ฒ๋ง ํ ๋น` ๋ฑ์ ์ฌ์ฉ ๊ฐ๋ฅ
- ์ดํฐ๋ฌ๋ธ์ Symbol.iterator ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด ๋ฉ์๋๊ฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํ
์์
const arr = [1, 2, 3]; // ๋ฐฐ์ด (๋ํ์ ์ธ ์ดํฐ๋ฌ๋ธ)
const str = "hi"; // ๋ฌธ์์ด๋ ์ดํฐ๋ฌ๋ธ
const set = new Set([1, 2, 3]); // Set๋ ์ดํฐ๋ฌ๋ธ
for (const val of arr) console.log(val); // 1, 2, 3
์ดํฐ๋ ์ดํฐ(Iterator)
์ ์
- ์ดํฐ๋ฌ๋ธ์ ์ค์ ๋ก ์ํํ๋ ๋ฉ์ปค๋์ฆ
- `next()` ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ `{ done: Boolean, value: any }`์ ๊ฐ์ ํํ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
- `done: true` ๊ฐ ๋ ๋๊น์ง ์ํ
์์
const arr = [1, 2, 3];
const iterator = arr[Symbol.iterator]();
console.log(iterator.next()); // { done: false, value: 1 }
console.log(iterator.next()); // { done: false, value: 2 }
console.log(iterator.next()); // { done: false, value: 3 }
console.log(iterator.next()); // { done: true, value: undefined }
์ดํฐ๋ฌ๋ธ ↔ ๋ฐฐ์ด ๋ฉ์๋ ํ์ฉ
- ์ดํฐ๋ฌ๋ธ์ ๋ฐฐ์ด๋ก ๋ณํํด `map`, `filter` ๊ฐ์ ๊ณ ์ฐจ ํจ์ ํ์ฉ ๊ฐ๋ฅ
const set = new Set([1, 2, 3]);
const doubled = [...set].map(x => x * 2); // [2, 4, 6]
์ฅ์
- ์ผ๊ด๋ ๋ฐ๋ณต ํ๋กํ ์ฝ ์ ๊ณต
→ for...of, ์คํ๋ ๋, ๋์คํธ๋ญ์ฒ๋ง ๋ฑ ์ด๋์๋ ํ์ฉ ๊ฐ๋ฅ - ๋ฐ์ดํฐ ๊ตฌ์กฐ ํ์ฅ ๊ฐ๋ฅ
→ ํธ๋ฆฌ, ๊ทธ๋ํ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ๊ตฌ์กฐ์์๋ ์ํ๋ ์์(DFS, BFS ๋ฑ)๋ก ์ํ ์ ์ ๊ฐ๋ฅ - ์ ์ฐ์ฑ
→ ์ด๋ค ์์, ์ด๋ค ์กฐ๊ฑด์ผ๋ก๋ ๋ฐ๋ณต ๋์์ ์ง์ ์ ์ํ ์ ์์
ํ๊ณ
- ์ฑ๋ฅ ๋ฌธ์
- ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ํ ์ next() ํธ์ถ ๋น์ฉ ๋์
- ๋ณต์กํ ๊ตฌ์กฐ์ผ์๋ก ์ ๊ทผ ๋น์ฉ ์ฆ๊ฐ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ
- ์ดํฐ๋ ์ดํฐ๋ ์ํ(state)๋ฅผ ์ ์ฅํด์ผ ํ๋ฏ๋ก ๋์์ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฐ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด
// ์ํ ๋์ ์์
[Symbol.iterator]() {
this.current = this.from;
return this;
},
3. ๋ฐฐ์ด ๋ฉ์๋ ์ง์ ์ฌ์ฉ ๋ถ๊ฐ
- ์ดํฐ๋ฌ๋ธ ์์ฒด๋ map, filter ๊ฐ์ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ๋ฐ๋ก ์ธ ์ ์์ → ๋ฐฐ์ด๋ก ๋ณํํด์ผ ํจ
๊ฐ์ ๋ฐฉ์
- ์ ๋๋ ์ดํฐ(Generator)
- ์ดํฐ๋ฌ๋ธ+์ดํฐ๋ ์ดํฐ๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ ๋ฌธ๋ฒ
- yield๋ฅผ ์ฌ์ฉํด ํ์ํ ๋๋ง ๊ฐ์ ์์ฑ (lazy evaluation)
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์
- `function* numbers() { yield 1; yield 2; yield 3; } for (const n of numbers()) { console.log(n); // 1, 2, 3 }`
- Lazy Evaluation ๊ธฐ๋ฒ ํ์ฉ
- ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ์ง ์๊ณ , ํ์ํ ์๊ฐ์๋ง ๊ณ์ฐ/๋ฐํ
์ ์ฌ ๋ฐฐ์ด(array-like object)
์ ์
- ์ธ๋ฑ์ค์ `length` ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด ๋ฐฐ์ด์ฒ๋ผ ๋ณด์ด์ง๋ง
- `next()` ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ `{ done: Boolean, value: any }`์ ๊ฐ์ ํํ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
- ๋ฐ๋์ `Symbol.iterator`๊ฐ ๊ตฌํ๋์ด ์๋ ๊ฒ์ ์๋ → for...of, ์คํ๋ ๋ ๋ถ๊ฐ
์์
const obj = {0: 'a', 1: 'b', length: 2};
console.log(obj[0]); // 'a'
console.log(obj.length); // 2
// [...obj] // Error! ์ ์ฌ ๋ฐฐ์ด์ ์คํ๋ ๋ ๋ถ๊ฐ
๋ณํ ๋ฐฉ๋ฒ
Array.from(obj); // ['a','b']
์ฃผ์ํ ์
- ์ ์ฌ ๋ฐฐ์ด๊ณผ ์ดํฐ๋ฌ๋ธ์ ํท๊ฐ๋ฆฌ๊ธฐ ์ฌ์
- ์ ์ฌ ๋ฐฐ์ด์ด๋ฉด์ ์ดํฐ๋ฌ๋ธ์ธ ๊ฒฝ์ฐ๋ ์กด์ฌ
- ์: arguments, NodeList, HTMLCollection ๋ฑ
- ์ด๋ฐ ๊ฒฝ์ฐ๋ for...of๋ ์คํ๋ ๋(...) ์ฌ์ฉ ๊ฐ๋ฅ
๊ด๊ณ ์ ๋ฆฌ
์ดํฐ๋ฌ๋ธ(Iterable)
โโ Symbol.iterator ๋ฉ์๋ ์กด์ฌ
โโ ๋ฐํ → ์ดํฐ๋ ์ดํฐ(Iterator)
โโ next() ํธ์ถ๋ก ์ค์ ๋ฐ๋ณต ์ํ
โโ { value, done } ๋ฐํ
์ ์ฌ ๋ฐฐ์ด(array-like)
โโ ์ธ๋ฑ์ค + length๋ง ์กด์ฌ
โโ Symbol.iterator ์์ผ๋ฉด for...of/์คํ๋ ๋ ๋ถ๊ฐ
โโ Symbol.iterator ์์ผ๋ฉด ์ดํฐ๋ฌ๋ธ์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ (์: arguments, NodeList)
์ ๋ฆฌ
- ์ดํฐ๋ฌ๋ธ(Iterable): “๋ฐ๋ณตํ ์ ์๋ ๊ฐ์ฒด” (๋ฐฐ์ด, ๋ฌธ์์ด, Set, Map ๋ฑ)
- ์ดํฐ๋ ์ดํฐ(Iterator): “์ค์ ๋ก ๋ฐ๋ณต์ ์ํํ๋ ๋๊ตฌ” (next() ์ฌ์ฉ)
- ๊ด๊ณ: ์ดํฐ๋ฌ๋ธ์ Symbol.iterator๋ฅผ ๊ตฌํํด์ผ ํ๊ณ , ์ด ๋ฉ์๋๊ฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํ
- ๊ฐ์ : ์ผ๊ด๋ ๋ฐ๋ณต ํ๋กํ ์ฝ, ๋ค์ํ ๊ตฌ์กฐ ์ง์, ์ ์ฐํ ์ํ
- ํ๊ณ: ๋๊ท๋ชจ ๋ฐ์ดํฐ์์ ์ฑ๋ฅ·๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด
- ๋ณด์: ์ ๋๋ ์ดํฐ์ lazy evaluation ํ์ฉ
| ๐ ์ฐธ๊ณ ๋ฌธํ |
| ์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ |
| Inpa Dev - ์ดํฐ๋ฌ๋ธ & ์ดํฐ๋ ์ดํฐ |
| F-Lab - ์๋ฐ์คํฌ๋ฆฝํธ์์์ ๋ฐ๋ณต ํ๋กํ ์ฝ ์ดํดํ๊ธฐ |
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ํฐ์น์ ํด๋ฆญ ์ด๋ฒคํธ (3) | 2025.08.05 |
|---|---|
| window.open ์ ์ฌ์ฉํ ๋ ํ์ ์ฐฝ์ ์ฌ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ (0) | 2025.05.09 |
| ์น ์ปดํฌ๋ํธ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ (0) | 2024.11.25 |