AI๋กœ ์ƒ์„ฑํ•ด ๋ดค์Šต๋‹ˆ๋‹ค. ์˜คํƒ€๊ฐ€ ์žˆ์ง€๋งŒ ๋‚˜์˜์ง€ ์•Š๋„ค์š”!

 

์ดํ„ฐ๋Ÿฌ๋ธ”(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]
 

 

์žฅ์ 

  1. ์ผ๊ด€๋œ ๋ฐ˜๋ณต ํ”„๋กœํ† ์ฝœ ์ œ๊ณต
    → for...of, ์Šคํ”„๋ ˆ๋“œ, ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ๋“ฑ ์–ด๋””์„œ๋“  ํ™œ์šฉ ๊ฐ€๋Šฅ
  2. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํ™•์žฅ ๊ฐ€๋Šฅ
    → ํŠธ๋ฆฌ, ๊ทธ๋ž˜ํ”„ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์กฐ์—์„œ๋„ ์›ํ•˜๋Š” ์ˆœ์„œ(DFS, BFS ๋“ฑ)๋กœ ์ˆœํšŒ ์ •์˜ ๊ฐ€๋Šฅ
  3. ์œ ์—ฐ์„ฑ
    → ์–ด๋–ค ์ˆœ์„œ, ์–ด๋–ค ์กฐ๊ฑด์œผ๋กœ๋“  ๋ฐ˜๋ณต ๋™์ž‘์„ ์ง์ ‘ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ

 

 

ํ•œ๊ณ„

  1. ์„ฑ๋Šฅ ๋ฌธ์ œ
    • ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ˆœํšŒ ์‹œ next() ํ˜ธ์ถœ ๋น„์šฉ ๋ˆ„์ 
    • ๋ณต์žกํ•œ ๊ตฌ์กฐ์ผ์ˆ˜๋ก ์ ‘๊ทผ ๋น„์šฉ ์ฆ๊ฐ€
  2. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€
    • ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ƒํƒœ(state)๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์“ฐ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋‹ด
// ์ƒํƒœ ๋ˆ„์  ์˜ˆ์‹œ
  [Symbol.iterator]() {
    this.current = this.from;
    return this;
  },

 

 

  3. ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ ์ง์ ‘ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

  • ์ดํ„ฐ๋Ÿฌ๋ธ” ์ž์ฒด๋Š” map, filter ๊ฐ™์€ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์—†์Œ → ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•จ

 

๊ฐœ์„ ๋ฐฉ์•ˆ

  1. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ(Generator)
    • ์ดํ„ฐ๋Ÿฌ๋ธ”+์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•
    • yield๋ฅผ ์‚ฌ์šฉํ•ด ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ฐ’์„ ์ƒ์„ฑ (lazy evaluation)
    • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ 
    • `function* numbers() { yield 1; yield 2; yield 3; } for (const n of numbers()) { console.log(n); // 1, 2, 3 }`
  2. 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 - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ๋ฐ˜๋ณต ํ”„๋กœํ† ์ฝœ ์ดํ•ดํ•˜๊ธฐ

 

+ Recent posts