B23 : iterable ๊ฐ์ฒด

2025. 8. 29. 22:36ใ†Front-end/JavaScript

๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

1. iterable ๊ฐ์ฒด

    1-1. iterable ๊ฐ์ฒด์˜ ๊ฐœ๋…

    1-2. iterable ๊ฐœ๋… ์ดํ•ดํ•ด๋ณด๊ธฐ

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

3. Array.from์œผ๋กœ Array ๋งŒ๋“ค๊ธฐ


1. iterable ๊ฐ์ฒด

1. iterable ๊ฐ์ฒด์˜ ๊ฐœ๋…

iterable ๊ฐ์ฒด๋Š” ๋ฐฐ์—ด์„ ์ผ๋ฐ˜ํ™”ํ•œ ๊ฐ์ฒด์ด๋‹ค.

  • ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์˜ ๊ฐ์ฒด์ด๋‹ค.
  • ๋Œ€ํ‘œ์ ์œผ๋กœ ๋ฐฐ์—ด, ์œ ์‚ฌ๋ฐฐ์—ด, ๋ฌธ์ž์—ด, map, set ๋“ฑ์ด ์žˆ๋‹ค.
  • ์ดํ„ฐ๋ ˆ์ด์…˜(Symbol.iterator)ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์•ผํ•œ๋‹ค.
  • for..of ๋ฌธ๋ฒ•์„ ์ ์šฉํ•˜์—ฌ ์ˆœํšŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. iterable ๊ฐœ๋… ์ดํ•ดํ•ด๋ณด๊ธฐ

์šฐ์„  ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ผ๋Š” ๊ฐœ๋…์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

let range = {
	from: 1,
	to: 5,
};

๊ฐ์ฒด range๋Š” 1๋ถ€ํ„ฐ 5๊นŒ์ง€์˜ ๊ฐ„๊ฒฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์—ฌ๊ธฐ์— Symbol.iterator(ํŠน์ˆ˜ ๋‚ด์žฅ ์‹ฌ๋ณผ) ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ดํ„ฐ๋Ÿฌ๋ธ”๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

for..of๊ฐ€ ๋™์ž‘ํ•˜๋„๋ก ํ•˜๋Š” Symbol.iterator ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

let range = {
  from: 1,
  to: 5,
};

// range์— ์•„๋ž˜์™€ ๊ฐ™์ด ๊ธฐ๋Šฅํ•˜๋Š” ํ•จ์ˆ˜ Symbol.iterator๋ฅผ ์ถ”๊ฐ€ํ•ด๋ดค๋‹ค.
range[Symbol.iterator] = function() {
  return {
    current: this.from,
    last: this.to,
    next() {
      if(this.current <= this.last) {
        return { done: false, value: this.current++ };
      } else {
        return { done: true };
      }
    }
  };
};

for(let num of range) {
  alert(num);
}

๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ ๊ฐ์ฒด range์—๋Š” ์—ฌ์ „ํžˆ ๋ฉ”์„œ๋“œ next()๊ฐ€ ์—†์ง€๋งŒ,

์ถ”๊ฐ€ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ๋ฉ”์„œ๋“œ next()๋กœ ๋ฐ˜๋ณต์— ์‚ฌ์šฉ๋  ๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ด๊ณ  ์žˆ๋‹ค.

 

๋ฐ˜๋ณต ๋Œ€์ƒ์˜ ๊ฐ์ฒด์™€, ๋ฐ˜๋ณต์„ ํ•˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค.

 

[Symbol.iterator]๋ฅผ range์— ํฌํ•จ์‹œ์ผœ๋„ ๊ทธ๋Ÿฐ ๋ฐฉํ–ฅ์œผ๋กœ ๊ธฐ๋Šฅํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํ•˜๋‹ค.

let range = {
  from: 1,
  to: 5,
  [Symbol.iterator]() {
    this.current = this.from;
    return this;
  },
  
  next() {
    if(this.current <= this.to) {
      return { done: false, value: this.current++ };
      } else {
        return { done: true };
      }
    }
  };
  
  for (let num of range) {
    alert(num);	// 1, 2, 3, 4, 5
  }

 


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

๋ฐฐ์—ด๊ณผ ๋ฌธ์ž์—ด์€ ๋งŽ์ด ์“ฐ์ด๋Š” ๋‚ด์žฅ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‹ค.

for (let char of "test") {
  alert(char);	// t, e, s, t
}

๋‚ด๋ถ€์ ์œผ๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ์— ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด์ธ ๊ฒƒ์ด๋‹ค.

 

์šฐ๋ฆฌ๋Š” ๋‚ด์žฅ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.

let str = 'hello';

let iterator = str[Symbol.iterator]();

while(true) {
  let result = iterator.next();
  if(result.done) break;
  console.log(result.value);	// h, e, l, l, o
}

 

์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์œผ๋‚˜, ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์˜€์„ ๊ฒฝ์šฐ for..of๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค

๋ฐ˜๋ณต์„ ๋” ์„ธ์„ธํ•˜๊ฒŒ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 


3. Array.from์œผ๋กœ ์ง„์งœ Array ๋งŒ๋“ค๊ธฐ

๋ฉ”์„œ๋“œ Array.from์œผ๋กœ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‚˜ ์œ ์‚ฌ ๋ฐฐ์—ด์„ ๋ฐ›์•„ ์ง„์งœ Array๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‚˜ ์œ ์‚ฌ ๋ฐฐ์—ด์— ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

// Array.from(์œ ์‚ฌ๋ฐฐ์—ด)
let arrayLike = {
  0: "Hello",
  1: "World",
  length: 2
};

let arr = Array.from(arrayLike);
console.log(arr.pop());	// World

// Array.from(์ดํ„ฐ๋Ÿฌ๋ธ”)
let arr = Array.from(range);
console.log(arr);	// 1, 2, 3, 4, 5

 

Array.from ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ์ดํ„ฐ๋Ÿฌ๋ธ”/์œ ์‚ฌ๋ฐฐ์—ด์ธ์ง€ ์กฐ์‚ฌํ•œ๋‹ค.

๋„˜๊ฒจ ๋ฐ›์€ ์ธ์ˆ˜๊ฐ€ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‚˜ ์œ ์‚ฌ๋ฐฐ์—ด์ด ๋งž๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ , ๊ฐ์ฒด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณต์‚ฌํ•œ๋‹ค.

 

// Array.from(obj[, mapFn, thisArg])

const multiplier = {
  factor: 3,
};

const str = "12345";

const arr = Array.from(
  str,	//  1. ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค ์ดํ„ฐ๋Ÿฌ๋ธ”
  function(char) { return Number(char) * this.factor; },  // 2. ๊ฐ ์š”์†Œ์— ์ ์šฉํ•  ํ•จ์ˆ˜(this๊ฐ€ multiplier๋ฅผ ๊ฐ€๋ฆฌํ‚ด)
  multiplier	// 3. ๊ฐ ์š”์†Œ์— this๋ฅผ ์ง€์ •
};

console.log(arr);  // [3, 6, 9, 12, 15]
  • obj : ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค ์ดํ„ฐ๋Ÿฌ๋ธ”/์œ ์‚ฌ ๋ฐฐ์—ด
  • mapFn : ๊ฐ ์š”์†Œ์— ์ ์šฉํ•  ํ•จ์ˆ˜
  • thisArg : ๊ฐ ์š”์†Œ์˜ this๋ฅผ ์ง€์ •

 

 

 

 

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•