์ดํ„ฐ๋ ˆ์ด์…˜

8/12/2022

์ž‘์„ฑ์ž : ํ™์›๋ฐฐ

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

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋กœ for.. of ๋ฌธ์ด๋‚˜ ์Šคํ”„๋ ˆ๋“œ ๋“ฑ์˜ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” [Symbol.iterator]() ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด
  • [Symbol.iterator]๋ผ๋Š” Symbol๊ฐ’์„ ํ‚ค๋กœ ์„ค์ •
ย 
์ „์—ญ Symbol์— ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค
์ „์—ญ Symbol์— ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค

Symbol

  • Symbol.iterator๋Š” Symbol ์ƒ์„ฑ์žํ•จ์ˆ˜์˜ ์ •์  ๋ฉ”์†Œ๋“œ์ด๋ฉฐ well-known Symbol ๊ฐ’์ด๋‹ค
  • Well-known Symbol์ธ Symbol.iterator ๋ฉ”์„œ๋“œ๋ฅผ ํ”„๋กœํผํ‹ฐ ํ‚ค ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์ดํ„ฐ๋Ÿฌ๋ธ”๋กœ ๋™์ž‘ํ•œ๋‹ค
๐Ÿ’ก
์ „์—ญ Symbol์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” Symbol.for()๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฉฐ ์ผ๋ฐ˜ Symbol ์ƒ์„ฑ์ž๋กœ ๋งŒ๋“œ๋Š” ์ธ์Šคํ„ด์Šค๋Š” ์„ค๋ช…์ž๋ฅผ ๋„ฃ์€ ๊ฒƒ์ผ ๋ฟ์ด๋‹ค
ย 
//์ดํ„ฐ๋Ÿฌ๋ธ” const iterable =['a','b','c'] //์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค const iterator = iterable[Symbol.iterator](); console.log(iterator.next()); // { value: 'a', done: false } console.log(iterator.next()); // { value: 'b', done: false } console.log(iterator.next()); // { value: 'c', done: false } console.log(iterator.next()); // { value: undefined, done: true }
ย 
ย 

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

{value: ๊ฐ’, done: true/false} ํ˜•ํƒœ์˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” next() ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด
ย 
//์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด const iterable = ['a','b','c']; console.dir(iterable); // => Symbol.iterator๊ฐ€ key๊ฐ€ ๋œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค iterable[Symbol.iteartor](); //=> Iterator {} ๊ฐ์ฒด ๋ฐ˜ํ™˜ // iterator๋Š” next method๋ฅผ ๊ฐ€์ง„๋‹ค // next method๋Š” {value, done}์„ ํ‚ค๋กœ ๊ฐ€์ง„๋‹ค
ย 

์ œ๋„ˆ๋ ˆ์ดํ„ฐ

  • ES6์—์„œ ๋„์ž…๋œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
  • ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ฉด์„œ ๋™์‹œ์— ์ดํ„ฐ๋ ˆ์ดํ„ฐ์ธ ๊ฐ์ฒด
// ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ฉด์„œ ๋™์‹œ์— ์ดํ„ฐ๋ ˆ์ดํ„ฐ const createInfinityByIteration = function () { let i = 0; // ์ž์œ  ๋ณ€์ˆ˜ return { [Symbol.iterator]() { return this; }, //=> ์ž๊ธฐ์ž์‹ ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ์ง€, ์—ฌํƒœ๊นŒ์ง€์˜ ๋ฐ˜๋ณต๋œ ์ง„ํ–‰์ƒํ™ฉ์„ ๊ธฐ์–ตํ•œ๋‹ค next() { return { value: ++i }; } }; }; // ๋ฌดํ•œ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜ const infiniteFibonacci = (function () { let [pre, cur] = [0, 1]; return { [Symbol.iterator]() { return this; }, next() { [pre, cur] = [cur, pre + cur]; // done ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ๋žตํ•œ๋‹ค. return { value: cur }; } }; }()); // infiniteFibonacci๋Š” ๋ฌดํ•œ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‹ค. for (const num of infiniteFibonacci) { if (num > 10000) break; console.log(num); // 1 2 3 5 8... } // ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด... // ๋ฌดํ•œ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜ const createInfiniteFibByGen = function* (max) { let [prev, curr] = [0, 1]; while (true) { [prev, curr] = [curr, prev + curr]; if (curr >= max) return; // ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜ ์ข…๋ฃŒ yield curr; } }; for (const num of createInfiniteFibByGen(10000)) { console.log(num); }
์ปค์Šคํ…€ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ๋งŒ๋“ค์–ด๋ณด์ž
ํ•จ์ˆ˜๋ฅผ ํ•œ๋ฒˆ์— ๋‹ค ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ผ์‹œ ์ค‘์ง€ํ–ˆ๋‹ค๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค
์ดํ„ฐ๋ ˆ์ด์…˜ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•ด์„œ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค
์‹ค์‚ฌ์šฉ์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์›ํ•  ๋•Œ ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ๋ฉˆ์ถ”๊ณ  ํ•„์š”ํ•  ๋•Œ ๋‹ค์‹œ ์ค‘๋‹จ์ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๐Ÿ‘‰
But, ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋Š” ES7์—์„œ ๋น„๋™๊ธฐํ•จ์ˆ˜์—์„œ ๋” ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
ย 
ย 

์ •๋ฆฌ

์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ž€?
์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฐ์ฒด
๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•˜๊ธฐ ์œ„ํ•œ ES6 ํ†ต์ผ๋œ ๊ทœ์•ฝ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ณ 
Symbol.iteartor๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
ย 
์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ž€?
value, done์ด๋ผ๋Š” ํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” next๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
ย 
์ œ๋„ˆ๋ ˆ์ดํ„ฐ
์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด๋ฅผ ์ดํ„ฐ๋ ˆ์ด์…˜ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋ฉด์„œ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜
์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ฉด์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
ย 
arguments, NodeList, HTMLCollection ์€ ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด์ด๊ธฐ์— length๋ฅผ ํ†ตํ•ด ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•(for โ€ฆ in)๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋™์‹œ์— ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ง€์›ํ•œ๋‹ค (for โ€ฆ of)

์ฐธ์กฐ

ย