λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
javascript/πŸ“– study

[7μ£Όμ°¨ μŠ€ν„°λ””]34μž₯-μ΄ν„°λŸ¬λΈ”

by HomieKim 2022. 3. 27.

μ΄ν„°λŸ¬λΈ”

μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œ

  • μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ€ 순회 κ°€λŠ₯ν•œ 데이터 μ»¬λ ‰μ…˜μ„ λ§Œλ“€κΈ° μœ„ν•΄ ECMAScript 사양에 μ •μ˜ν•˜μ—¬ 미리 μ•½μ†ν•œ κ·œμΉ™μ΄λ‹€.
  • es6μ΄μ „μ˜ 순회 κ°€λŠ₯ν•œ 데이터 μ»¬λ ‰μ…˜(λ°°μ—΄, λ¬Έμžμ—΄ λ“±λ“±..)은 ν†΅μΌλœ κ·œμ•½ 없이 각자 λ‚˜λ¦„μ˜ ꡬ쑰λ₯Ό 가지고 있음
  • es6μ—μ„œλŠ” 순회 κ°€λŠ₯ν•œ 데이터 μ»¬λ ‰μ…˜μ„ μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” μ΄ν„°λŸ¬λΈ”λ‘œ 톡일
  • μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ—λŠ” μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œκ³Ό μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ΄ μžˆλ‹€.

μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œ(iterable protocol)

  • Well-known Symbol인 Symbol.iteratorλ₯Ό ν”„λ‘œνΌν‹° ν‚€λ‘œ μ‚¬μš©ν•œ λ©”μ„œλ“œλ₯Ό 직접 κ΅¬ν˜„ν•˜κ±°λ‚˜ 상속 λ°›μ•„ Symbol.iterator λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•˜λŠ” κ·œμ•½μ„ μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ΄λΌ ν•œλ‹€.
  • μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체λ₯Ό μ΄ν„°λŸ¬λΈ” μ΄λΌν•œλ‹€.
  • μ΄ν„°λŸ¬λΈ”μ€ for...of 문으둜 μˆœνšŒν•  수 있고 , μŠ€ν”„λ ˆλ“œ 문법과 λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ήμ˜ λŒ€μƒμœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œ(iterator protocol)

  • μ΄ν„°λ ˆμ΄ν„°λŠ” nextλ©”μ„œλ“œλ₯Ό μ†Œμœ ν•˜κ³  next λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μ΄ν„°λŸ¬λΈ”μ„ μˆœνšŒν•˜λ©° value와 done ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” μ΄ν„°λ ˆμ΄ν„° 리절트 객체λ₯Ό λ°˜ν™˜, μ΄λŸ¬ν•œ κ·œμ•½μ„ μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ΄λΌκ³  ν•œλ‹€
  • μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체λ₯Ό μ΄ν„°λ ˆμ΄ν„°λΌκ³  ν•œλ‹€.

정리

  • μ΄ν„°λŸ¬λΈ” : μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체
  • μ΄ν„°λ ˆμ΄ν„° : μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체
  • μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œ : Symbol.iterator(이건 Well-known Symbol)λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œ μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•˜λŠ” κ·œμ•½
  • μ΄ν„°λ ˆμ΄ν„° ν”„λ‘œν† μ½œ : μ΄ν„°λ ˆμ΄ν„°μ˜ ꡬ쑰에 λŒ€ν•œ κ·œμ•½μ„ 말함, μ΄ν„°λ ˆμ΄ν„° nextλ©”μ„œλ“œλ₯Ό μ†Œμœ ν•˜κ³  nextλ©”μ„œλ“œλŠ” μ΄ν„°λŸ¬λΈ”μ„ μˆœνšŒν•˜λ©° value와 done ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” μ΄ν„°λ ˆμ΄ν„° 리절트 객체λ₯Ό λ°˜ν™˜ 함

μ΄ν„°λŸ¬λΈ”

  • μ΄ν„°λŸ¬λΈ”μ€ Symbol.iteratorλ₯Ό ν”„λ‘œνΌν‹° ν‚€λ‘œ μ‚¬μš©ν•œ λ©”μ„œλ“œλ₯Ό 직접 κ΅¬ν˜„ν•˜κ±°λ‚˜ ν”„λ‘œν†  νƒ€μž… 체인을 톡해 상속 받은 객체
  • λ”°λΌμ„œ μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜μ§€ μ•Šμ€ κ°μ²΄λŠ” for..of 문으둜 순회 ν•  수 μ—†μœΌλ©° μŠ€ν”„λ ˆλ“œ 문법과 λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ήμ˜ λŒ€μƒμœΌλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€.
const obj = { a: 1, b: 2 };

// 일반 κ°μ²΄λŠ” Symbol.iterator λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜ 상속받지 μ•ŠλŠ”λ‹€.
// λ”°λΌμ„œ 일반 κ°μ²΄λŠ” μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹ˆλ‹€.
console.log(Symbol.iterator in obj); // false

// μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹Œ 일반 κ°μ²΄λŠ” for...of 문으둜 μˆœνšŒν•  수 μ—†λ‹€.
for (const item of obj) { // -> TypeError: obj is not iterable
  console.log(item);
}

// μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹Œ 일반 κ°μ²΄λŠ” λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ήμ˜ λŒ€μƒμœΌλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€.
const [a, b] = obj; // -> TypeError: obj is not iterable
  • 단, μ΅œμ‹  μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 일반 객체의 μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ μ‚¬μš©μ„ ν—ˆμš©ν•˜κ³  μžˆλ‹€
const obj = { a: 1, b : 2};

console.log({...obj}); // { a : 1, b: 2 }

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

  • Symbol.iterator λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•œ μ΄ν„°λ ˆμ΄ν„°λŠ” nextλ©”μ„œλ“œλ₯Ό κ°–λŠ”λ‹€.
  • nextλ©”μ„œλ“œλŠ” μ΄ν„°λŸ¬λΈ”μ˜ 각 μš”μ†Œλ₯Ό μˆœνšŒν•˜κΈ° μœ„ν•œ 포인터 역할을 ν•œλ‹€.
  • next ν•¨μˆ˜λ‘œ μ΄ν„°λŸ¬λΈ”μ„ ν•˜λ‚˜μ”© μˆœνšŒλ‚˜λŠ”λ° μˆœνšŒν•˜λŠ” 결과둜 μ΄ν„°λ ˆμ΄ν„° 리절트 객체(iterator result object)λ₯Ό λ°˜ν™˜ ν•©λ‹ˆλ‹€.
  • result κ°μ²΄λŠ” value ν”„λ‘œνΌν‹°μ™€ done ν”„λ‘œνΌν‹°λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλŠ”λ°, valueλŠ” ν˜„μž¬ μˆœνšŒν•˜κ³  μžˆλŠ” μ΄ν„°λŸ¬λΈ”μ˜ κ°’, done은 순회 μ™„λ£Œ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λƒ„

빌트인 μ΄ν„°λŸ¬λΈ”

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ œκ³΅ν•˜λŠ” 빌트인 μ΄ν„°λŸ¬λΈ”μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    • Array
    • String
    • Map
    • Set
    • TypedArray
    • arguments
    • DOM μ»¬λ ‰μ…˜ (NodeList, HTMLCollection)

for ... of λ¬Έ

  • for ... of 문은 μ΄ν„°λŸ¬λΈ”μ„ μˆœνšŒν•˜λ©΄μ„œ μ΄ν„°λŸ¬λΈ”μ˜ μš”μ†Œλ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€.
for (λ³€μˆ˜μ„ μ–Έλ¬Έ of μ΄ν„°λŸ¬λΈ”) { ... }
  • for ... in 문의 ν˜•μ‹κ³Ό μœ μ‚¬ν•˜μ§€λ§Œ 차이점이 μžˆμŠ΅λ‹ˆλ‹€.
for (λ³€μˆ˜μ„ μ–Έλ¬Έ in 객체) { ... }
  • for ... in 문은 객체의 ν”„λ‘œν† νƒ€μž… 체인 상에 μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  ν”„λ‘œν† νƒ€μž…μ˜ ν”„λ‘œνΌν‹° μ€‘μ—μ„œ [[ Enumerable ]]의 값이 true인 ν”„λ‘œνΌν‹°λ₯Ό μˆœνšŒν•˜λ©° μ—΄κ±°ν•œλ‹€.
  • for ... of 문은 λ‚΄λΆ€μ μœΌλ‘œ μ΄ν„°λ ˆμ΄ν„°μ˜ next λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 순회, result 객체의 value값을 μ„ μ–Έν•œ λ³€μˆ˜μ— ν• λ‹Ή, done ν”„λ‘œνΌν‹° 값이 true λ©΄ 순회λ₯Ό 쀑단.

μ΄ν„°λŸ¬λΈ”κ³Ό μœ μ‚¬λ°°μ—΄ 객체

μœ μ‚¬ λ°°μ—­κ°μ²΄λž€, λ°°μ—΄ 처럼 인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Όν•  수 있고, length ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체λ₯Ό λ§ν•œλ‹€.

  • μœ μ‚¬ λ°°μ—­ κ°μ²΄λŠ” μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹Œ 일반 객체, λ”°λΌμ„œ Symbol.iterator λ©”μ„œλ“œκ°€ μ—†κ³ , for ... of 문으둜 μˆœνšŒν•  수 μ—†λ‹€.

  • 단, argument, NodeList, HTMLCollection은 μœ μ‚¬ λ°°μ—΄ κ°μ²΄μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ”μ΄λ‹€.

  • Array.from λ©”μ„œλ“œλŠ” μœ μ‚¬ λ°°μ—΄ 객체 λ˜λŠ” μ΄ν„°λŸ¬λΈ”μ„ λ°°μ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜ ν•©λ‹ˆλ‹€.

const arrayLike = {
    0 : 1,
    1 : 2,
    2 : 3,
    length : 3
};

const arr = Array.from(arrayLike);
console.log(arr);

μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ˜ ν•„μš”μ„±

  • es6μ΄μ „μ˜ 순회 κ°€λŠ₯ν•œ 데이터 μ»¬λ ‰μ…˜λ“€μ€ (Array, String, Map, Set λ“±λ“±..) ν†΅μΌλœ κ·œμ•½μ—†μ΄ 각자 λ‚˜λ¦„μ˜ ꡬ쑰λ₯Ό 가지고 λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ μˆœνšŒν•˜μ—¬ μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • es6μ—μ„œλŠ” μˆœνšŒκ°€λŠ₯ν•œ 데이터 μ»¬λ ‰μ…˜λ“€μ„ μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” μ΄ν„°λŸ¬λΈ”λ‘œ ν†΅μΌν•˜μ—¬ for ... ofλ¬Έ, μŠ€ν”„λ ˆλ“œ 문법, λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ήμ˜ λŒ€μƒμœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ 일원화

    μ΄ν„°λŸ¬λΈ”(μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ 객체)은 데이터 κ³΅κΈ‰μžμ˜ 역할을 ν•œλ‹€κ³  λ³Ό 수 μžˆλ‹€.
    데이터 μ†ŒλΉ„μž λŠ” for ..ofλ¬Έ, μŠ€ν”„λŸ¬λ“œλ¬Έλ²•, λ°°μ—΄ λ””μŠ€ν„°λŸ­μ²˜λ§ ν• λ‹Ή λ“±...

  • λ§Œμ•½ λ‹€μ–‘ν•œ 데이터 κ³΅κΈ‰μžκ°€ 각자의 μˆœνšŒλ°©μ‹μ„ κ°–λŠ”λ‹€λ©΄ 데이터 μ†ŒλΉ„μžλŠ” 데이터 κ³΅κΈ‰μžμ˜ 순회 방식을 λͺ¨λ‘ μ§€μ›ν•΄μ•Όν•©λ‹ˆλ‹€. (λΉ„νš¨μœ¨μ )

  • 즉, μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ κ·œμ•½ν™”ν•˜μ—¬ 데이터 μ†ŒλΉ„μžκ°€ 효율적으둜 데이터 κ³΅κΈ‰μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ μ—°κ²°ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€ 역할을 ν•©λ‹ˆλ‹€.

μ‚¬μš©μž μ •μ˜ μ΄ν„°λŸ¬λΈ”

  • μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜μ§€ μ•ŠλŠ” 일반 객체도 μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λ„λ‘ κ΅¬ν˜„ν•˜λ©΄ μ‚¬μš©μž μ •μ˜ μ΄ν„°λŸ¬λΈ”μ΄ λœλ‹€.
  • ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ„ κ΅¬ν˜„ν•œ μ‚¬μš©μž μ •μ˜ μ΄ν„°λŸ¬λΈ”
const fibonacci = {

  [Symbol.iterator]() {
    let [pre, cur] = [0,1];
    const max = 10;

    return {
      next(){
        [pre, cur] = [cur, pre+cur];
        return {value : cur, done : cur >= max};
      }
    };
  }
}
// μ΄ν„°λŸ¬λΈ”μ„ μˆœνšŒν•  λ•Œλ§ˆλ‹€ nextλ©”μ„œλ“œκ°€ 호좜 됨
for(const num of fibonacci){
  console.log(num);
}

μ΄ν„°λŸ¬λΈ”μ„ μƒμ„±ν•˜λŠ” ν•¨μˆ˜

  • μ™ΈλΆ€μ—μ„œ μ΅œλŒ€ μˆ˜μ—΄μ˜ 값을 전달 λ°›μ•„ μ΄ν„°λŸ¬λΈ”μ€ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
// ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ„ κ΅¬ν˜„ν•œ μ‚¬μš©μž μ •μ˜ μ΄ν„°λŸ¬λΈ”μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜. μˆ˜μ—΄μ˜ μ΅œλŒ€κ°’μ„ 인수둜 μ „λ‹¬λ°›λŠ”λ‹€.
const fibonacciFunc = function (max) {
  let [pre, cur] = [0, 1];

  // Symbol.iterator λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•œ μ΄ν„°λŸ¬λΈ”μ„ λ°˜ν™˜ν•œλ‹€.
  return {
    [Symbol.iterator]() {
      return {
        next() {
          [pre, cur] = [cur, pre + cur];
          return { value: cur, done: cur >= max };
        }
      };
    }
  };
};

// μ΄ν„°λŸ¬λΈ”μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μ— μˆ˜μ—΄μ˜ μ΅œλŒ€κ°’μ„ 인수둜 μ „λ‹¬ν•˜λ©΄μ„œ ν˜ΈμΆœν•œλ‹€.
for (const num of fibonacciFunc(10)) {
  console.log(num); // 1 2 3 5 8
}

μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ μ΄ν„°λ ˆμ΄ν„°μΈ 객체λ₯Ό μƒμ„±ν•˜λŠ” ν•¨μˆ˜

  • μ΄ν„°λ ˆμ΄ν„° 생성을 μœ„ν•΄μ„œ Symbol.iterator λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ μ΄ν„°λ ˆμ΄ν„°μΈ 객체λ₯Ό λ°˜ν™˜ν•˜μ—¬ λ©”μ„œλ“œ 호좜 없이 μ΄ν„°λŸ¬λΈ”μ„ μˆœνšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
// μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ μ΄ν„°λ ˆμ΄ν„°μΈ 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
const fibonacciFunc = function (max) {
  let [pre, cur] = [0, 1];

  // Symbol.iterator λ©”μ„œλ“œμ™€ next λ©”μ„œλ“œλ₯Ό μ†Œμœ ν•œ μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ μ΄ν„°λ ˆμ΄ν„°μΈ 객체λ₯Ό λ°˜ν™˜
  return {
    [Symbol.iterator]() { return this; },
    // next λ©”μ„œλ“œλŠ” μ΄ν„°λ ˆμ΄ν„° 리절트 객체λ₯Ό λ°˜ν™˜
    next() {
      [pre, cur] = [cur, pre + cur];
      return { value: cur, done: cur >= max };
    }
  };
};

// iterλŠ” μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ μ΄ν„°λ ˆμ΄ν„°λ‹€.
let iter = fibonacciFunc(10);

// iterλŠ” μ΄ν„°λŸ¬λΈ”μ΄λ―€λ‘œ for...of 문으둜 μˆœνšŒν•  수 μžˆλ‹€.
for (const num of iter) {
  console.log(num); // 1 2 3 5 8
}

λ¬΄ν•œ μ΄ν„°λŸ¬λΈ”κ³Ό 지연 평가

  • μ΄ν„°λŸ¬λΈ”μ„ 톡해 λ¬΄ν•œ μˆ˜μ—΄μ„ κ°„λ‹¨νžˆ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
// λ¬΄ν•œ μ΄ν„°λŸ¬λΈ”μ„ μƒμ„±ν•˜λŠ” ν•¨μˆ˜
const fibonacciFunc = function () {
  let [pre, cur] = [0, 1];

  return {
    [Symbol.iterator]() { return this; },
    next() {
      [pre, cur] = [cur, pre + cur];
      // λ¬΄ν•œμ„ κ΅¬ν˜„ν•΄μ•Ό ν•˜λ―€λ‘œ done ν”„λ‘œνΌν‹°λ₯Ό μƒλž΅ν•œλ‹€.
      return { value: cur };
    }
  };
};

// fibonacciFunc ν•¨μˆ˜λŠ” λ¬΄ν•œ μ΄ν„°λŸ¬λΈ”μ„ μƒμ„±ν•œλ‹€.
for (const num of fibonacciFunc()) {
  if (num > 10000) break;
  console.log(num); // 1 2 3 5 8...4181 6765
}

// λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ 할당을 톡해 λ¬΄ν•œ μ΄ν„°λŸ¬λΈ”μ—μ„œ 3개의 μš”μ†Œλ§Œ μ·¨λ“ν•œλ‹€.
const [f1, f2, f3] = fibonacciFunc();
console.log(f1, f2, f3); // 1 2 3
  • μ΄ν„°λŸ¬λΈ”μ€ 데이터 κ³΅κΈ‰μžμ˜ 역할을 ν•©λ‹ˆλ‹€. (λ°°μ—΄, λ¬Έμžμ—΄ 등은 λͺ¨λ“  데이터λ₯Ό λ©”λͺ¨λ¦¬μ— 미리 ν™•λ³΄ν•œ λ‹€μŒ 데이터λ₯Ό 곡급)

  • ν•˜μ§€λ§Œ, μœ„ 예제의 μ΄ν„°λŸ¬λΈ”μ€ 지연 평가(lazy evaluation)λ₯Ό 톡해 데이터λ₯Ό 생성

    지연 ν‰κ°€λž€?
    데이터가 ν•„μš”ν•œ μ‹œμ  μ΄μ „κΉŒμ§€λŠ” 미리 데이터λ₯Ό μƒμ„±ν•˜μ§€ μ•Šλ‹€κ°€ 데이터가 ν•„μš”ν•œ μ‹œμ μ΄ 되면 κ·Έλ•Œμ•Ό λΉ„λ‘œμ†Œ 데이터λ₯Ό μƒμ„±ν•˜λŠ” 기법
    즉, 평가 κ²°κ³Όκ°€ ν•„μš”ν•  λ•Œ 가지 평가λ₯Ό λŠ¦μΆ”λŠ” 기법을 지연 평가 라고 ν•œλ‹€.

  • μœ„ 예제의 ν•¨μˆ˜λŠ” 데이터 μ†ŒλΉ„μžμœ for ... ofλ‚˜ λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ή 등이 μ‹€ν–‰ 되기 μ΄μ „κΉŒμ§€ 데이터λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  • λ‚΄λΆ€μ—μ„œ nextλ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ”λ° λ°”λ‘œ μ΄λ•Œ 데이터가 생성 됨

  • 지연 평가λ₯Ό μ‚¬μš©ν•˜λ©΄ λΆˆν•„μš”ν•œ 데이터λ₯Ό 미리 μƒμ„±ν•˜μ§€ μ•Šκ³ , ν•„μš”ν•œ 데이터λ₯Ό ν•„μš”ν•œ μˆœκ°„μ— μƒμ„±ν•˜λ―€λ‘œ λΉ λ₯Έ μ‹€ν–‰ 속도λ₯Ό κΈ°λŒ€ν•  수 있고 λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό μ†ŒλΉ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€