[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개의 λŒ“κΈ€