[TIL] 06_iterable protocol, generator

MJ KimΒ·2021λ…„ 8μ›” 10일
1

TIL

λͺ©λ‘ 보기
6/12
post-thumbnail

πŸ’‘μƒˆλ‘­κ²Œ μ•Œκ²Œ 된 것


iterable protocol

μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ€ 순회(반볡) κ°€λŠ₯ν•œ 객체λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν”„λ‘œν† μ½œμ„ μ˜λ―Έν•œλ‹€.

for...of 반볡문, ... μ „κ°œ μ—°μ‚°μž(Spread Operator), ꡬ쑰 λΆ„ν•΄ λ“±κ³Ό ν•¨κ»˜ λ™μž‘ ν•  μˆ˜μžˆλ‹€.

μ•„λž˜ ES5, ES6μ—μ„œμ˜ 순회λ₯Ό λΉ„κ΅ν•΄λ³΄μž


κΈ°μ‘΄ ES5μ—μ„œμ˜ 순회
// index, length ν”„λ‘œνΌν‹°μ— 의쑴
const arr = [1, 2, 3];
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]) // 1 2 3 
}

const str = 'abc';
for (var i = 0; i < str.length; i++) {
console.log(str[i]) // a b c 
}
ES6μ—μ„œμ˜ 순회
// ES6 이후  --- 선언적
for (const a of arr) {
console.log(a) // 1 2 3 
}
for (const a of str) {
console.log(a) // a b c 
}

array 뿐만 μ•„λ‹ˆλΌ 기쑴에 인덱슀 μ‚¬μš©μ΄ λΆˆκ°€ν–ˆλ˜ set, mapκ³Ό 같은 객체듀을 λͺ¨λ‘ for...of 문으둜 μˆœνšŒν•  수 μžˆλ‹€.

const set = new Set([1, 2, 3]);
for (const a of set) console.log(a) // 1 2 3
console.log(set[0]) // undefined


const map = new Map([['a', 1], ['b', 2], ['c', 3]]);
for (const a of map) console.log(a) // ["a", 1]  ["b", 2]  ["c", 3]
console.log(map[0]) // undefined

μ΄λŸ¬ν•œ μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ€ ν•΄λ‹Ή 객체가 μ΄ν„°λŸ¬λΈ”μ΄μ—¬μ•Όλ§Œ κ°€λŠ₯ν•˜λ‹€.


iterable/iterator

  • μ΄ν„°λŸ¬λΈ”(iterable) : μ΄ν„°λ ˆμ΄ν„°(iterator)λ₯Ό λ¦¬ν„΄ν•˜λŠ” [Symbol.iterator]( )λΌλŠ” ν‚€κ°’μ˜ λ©”μ†Œλ“œλ₯Ό κ°€μ§„ 객체
    ex. arr, set, map

  • μ΄ν„°λ ˆμ΄ν„°(iterator) : { value, done }객체λ₯Ό λ¦¬ν„΄ν•˜λŠ” next()λ©”μ†Œλ“œλ₯Ό κ°€μ§„ 객체

console.dir(arr);

/*
> Array(3)
  > __proto__ : Array(0)
     ...
     > Symbol(Symbol.iterator): Ζ’ values()
     ...
*/

μœ„μ—μ„œ μ •μ˜ν•œ arr이 λ‚΄λΆ€μ—μ„œ Symbol(Symbol.iterator): Ζ’ values()λ₯Ό ν™•μΈν•¨μœΌλ‘œ λ‹€μŒκ³Ό 같은 사싀을 μ•Œ 수 μžˆλ‹€.

  • ArrayλŠ” Symbol(Symbol.iterator)λΌλŠ” keyλ₯Ό κ°€μ§„ ν•¨μˆ˜κ°€ μ‘΄μž¬ν•œλ‹€.
  • ArrayλŠ” μ΄ν„°λ ˆμ΄ν„°(iterator)λ₯Ό λ°˜ν™˜ν•˜λŠ” Symbol.iteratorλΌλŠ” ν‚€κ°’μ˜ λ©”μ†Œλ“œλ₯Ό κ°€μ§„ 객체이닀.

μ „κ°œμ—°μ‚°μž μ—­μ‹œ iterator protocol을 λ”°λ₯΄κ³  μžˆλ‹€

const a = [1, 2];
console.log([...a, ...[3, 4]]); // [ 1, 2, 3, 4 ]
console.log([...arr, ...set, ...map]); // [ 1, 2, 3, 1, 2, 3, [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]

a[Symbol.iterator] = null;
console.log([...a, ...[3, 4]]); // TypeError: a is not iterable

μ‚¬μš©μž μ •μ˜ iterable protocol

μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ 따라 순회 λ™μž‘μ„ μ‚¬μš©μžκ°€ μž„μ˜λ‘œ μ •μ˜ν•  수 μžˆλ‹€. μ΄λŠ” μ΄ν„°λŸ¬λΈ”μ΄ λ‹€μ–‘ν•˜κ²Œ ν™œμš©λ  수 μžˆμŒμ„ λœ»ν•œλ‹€.

const iterable = {
  [Symbol.iterator]() {
    let i = 3;
    return {
      next() {
        return i === 0 ? { done: true } : { value: i--, done: false }
      },
      [Symbol.iterator]() { return this; } 
    }
  }
}
let iterator = iterable[Symbol.iterator]();
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { done: true }

for (const a of iterable) console.log(a) // 3 2 1 


μ œλ„ˆλ ˆμ΄ν„°

μ œλ„ˆλ ˆμ΄ν„°μ˜ μ‹€ν–‰ 결과인 μ œλ„ˆλ ˆμ΄ν„° κ°μ²΄λŠ” μ΄ν„°λ ˆμ΄ν„° 객체이닀.
λ˜ν•œ [Symbol.iterator]()λ₯Ό κ°€μ§€λŠ” μ΄ν„°λŸ¬λΈ”μ΄κΈ°λ„ ν•˜λ‹€.

function *generator() {
  yield 1;
  if (false) yield 2;
  yield 3;
  return 100; 
}

let iter = generator();
console.log(iter[Symbol.iterator]() == iter) // true
console.log(iter.next()); // {value: 1, done: false}
console.log(iter.next()); // {value: 3, done: false}
console.log(iter.next()); // {value: 100, done: true}
console.log(iter.next()); // {value: undefined, done: true}

for (const a of generator()) console.log(a) // 1 3

μ œλ„ˆλ ˆμ΄ν„° κ°μ²΄λŠ” μ΄ν„°λ ˆμ΄ν„°μ΄μž μ΄ν„°λŸ¬λΈ”μ΄κΈ° λ•Œλ¬Έμ— μ—­μ‹œ μˆœνšŒκ°€ κ°€λŠ₯ν•˜λ‹€. λ˜ν•œ μ œλ„ˆλ ˆμ΄ν„°μ—λŠ” λ§ˆμ§€λ§‰μ— 리턴 값을 λ§Œλ“€ 수 μžˆλ‹€. ν•˜μ§€λ§Œ done λ˜ν•œ tureκ°€ 되기 λ•Œλ¬Έμ— 순회의 λŒ€μƒμ΄ λ˜μ§„ μ•ŠλŠ”λ‹€.

μ°Έκ³ 
λ°λΈŒμ½”μŠ€ κ°•μ˜
https://junhobaik.github.io/iterable-protocol/

πŸ’­λŠλ‚€μ 

μ΄ν„°λŸ¬λΈ”κ³Ό μ œλ„€λ ˆμ΄ν„°... 덕뢄에 λ‹€μ–‘ν•œ 데이터 νƒ€μž…λ“€μ„ μˆœνšŒν•˜κ³  κ°€κ³΅ν•˜λŠ” 것을 맀우 νŽΈλ¦¬ν•˜κ²Œ 해쀄 것 κ°™λ‹€!bb 전체적인 컨셉은 이해가 λ˜λ‚˜, μ•„μ§κΉŒμ§€ 각 단어와 κ°œλ…μ΄ μ™„λ²½νžˆ μ •λ¦½λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— λ‹€μ–‘ν•˜κ²Œ μž‘μ„±ν•΄λ³΄κ³  천천히 읡히며 μŠ΅λ“μ„ ν•  κ³„νšμ΄λ‹€.

profile
κΈ°μ΄ˆκ°€ νŠΌνŠΌν•œ 개발자둜 μ„±μž₯ν•˜κΈ° πŸ’» 🀞

0개의 λŒ“κΈ€