[JavaScript] Iterator

O2o2โœจยท2023๋…„ 4์›” 8์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
2/3

๐Ÿ <๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive>๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์š”์•ฝ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

1. ์ดํ„ฐ๋Ÿฌ๋ธ” (Iterable)


  • ์ดํ„ฐ๋ ˆ์ด์…˜ ํ”„๋กœํ† ์ฝœ(iteration protocol): ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ(iterable) ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ฏธ๋ฆฌ ์•ฝ์†ํ•œ ๊ทœ์น™์ด๋‹ค.
    ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ๊ณผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ์ด ์žˆ๋‹ค.
  • ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ: ๋ฐฐ์—ด, ๋ฌธ์ž์—ด, Map, Set ๋“ฑ
  • ์ด ์ž๋ฃŒ๊ตฌ์กฐ๋“ค์€ forโ€ฆof๋ฌธ, ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•, ๋ฐฐ์—ด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค

2. ์ดํ„ฐ๋Ÿฌ๋ธ”


  • ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ
  • ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.
  • ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์ด๋ž€ Symbol.iterator ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ์„๋•Œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ทœ์•ฝ์ด๋‹ค.
  • ์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
       
        // ์‚ฌ์šฉ์ž ์ •์˜๋กœ ์–ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ
        // ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด
        const iterable = {
          [Symbol.iterator]() {
            let num = 0;
            return {
              next() {
                return {
                  value: num++, done: num === 5
                };
              }
            }
          }
        }
        
        // ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด๋Š” for ...of๋กœ ์ˆœํšŒ๊ฐ€๋Šฅํ•˜๋‹ค
        for (const item of iterable) {
          console.log(item);
        }

3. ์ดํ„ฐ๋ ˆ์ดํ„ฐ


  • ์ดํ„ฐ๋Ÿฌ๋ธ”์— ์กด์žฌํ•˜๋Š” Symbol.iterator๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’
  • ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” next ํ•จ์ˆ˜๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ ์š”์†Œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ํฌ์ธํ„ฐ์ด๋‹ค.
  • next ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ value์™€ done์„ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    ์—ฌ๊ธฐ์„œ value๋Š” ํ˜„์žฌ ์ˆœํšŒ์ค‘์ธ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์ด๊ณ  done์€ ์ˆœํšŒ ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” booleanํƒ€์ž…์˜ ๊ฐ’์ด๋‹ค.
    // ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
    const func = () => {
     let i = 0;
     const max = 3;
     return {
       [Symbol.iterator]() {
         return {
           next() {
             return { value: i, done: i++ >= max };
           }
         }
       }
     }
    }
    const iterable = func();
    // ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ Symbol.iteratorํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    const iterator = iterable[Symbol.iterator]();
    // ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ next๋ฉ”์„œ๋“œ๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
    console.log(iterator.next()); // {value: 0, done: false}
    console.log(iterator.next()); // {value: 1, done: false}
    console.log(iterator.next()); // {value: 2, done: false}
    console.log(iterator.next()); // {value: 3, done: true}
profile
ํ”„๋ก ํŠธ์—”๋“œ & ํผ๋ธ”๋ฆฌ์…”

0๊ฐœ์˜ ๋Œ“๊ธ€

Powered by GraphCDN, the GraphQL CDN