๐Ÿ’ป ์ดํ„ฐ๋Ÿฌ๋ธ”๊ณผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ

waterglassesยท2022๋…„ 3์›” 28์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
7/50
post-thumbnail

์ดํ„ฐ๋Ÿฌ๋ธ”? ์ดํ„ฐ๋ ˆ์ดํ„ฐ? ๊ทธ๋™์•ˆ [Symbol.iterator] ๋“ค์–ด๋ณธ ์ ์€ ์žˆ๋Š”๊ฒŒ ์ด๊ฒŒ ๋ญ์ง€? ์‹ถ์—ˆ๋˜! ๋ฐ”๋กœ ๊ทธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๊ณ ์ž ํ•œ๋‹ค.

๐Ÿ“ƒ ์˜ค๋Š˜ ๊ณต๋ถ€ํ•œ ๊ฒƒ

์ดํ„ฐ๋Ÿฌ๋ธ”/์ดํ„ฐ๋ ˆ์ด์…˜ ํ”„๋กœํ† ์ฝœ

1. ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ
Symbol.iterator์„ ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ์‚ฌ์šฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ํ†ตํ•ด ์ƒ์†๋ฐ›์€ Symbol.iterator ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๊ทœ์•ฝ์„ ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ  ํ•œ๋‹ค.

2. ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ
์ดํ„ฐ๋Ÿฌ๋ธ”์˜ Symbol.iterator ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ์€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” next ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ˆœํšŒํ•˜๋ฉฐ value์™€ done ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฆฌ์ ˆํŠธ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๊ทœ์•ฝ์„ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ  ํ•œ๋‹ค.

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

์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ ๊ฐ์ฒด๋ฅผ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ฆ‰, Symbol.iterator๋ฅผ ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ์‚ฌ์šฉํ•œ ๋ฉ”์„œ๋“œ๋ฅด ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ํ”„๋กœํผํƒ€์ž… ์ฒด์ธ์„ ํ†ตํ•ด ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.

  • ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” [Symbol.iterator()] ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด
  • ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ Array.prototype์˜ Symbol.iterator๋ฅผ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‹ค.

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

์ดํ„ฐ๋Ÿฌ๋ธ”์˜ Symbol.interator ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ Symbol.iterator ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” next ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค.

  • {value, done} ํ˜•ํƒœ์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” next()๋ฅผ ๊ฐ€์ง„ ๊ฐ’
  • next ๋ฉ”์„œ๋“œ๋กœ ์ˆœํ™˜ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด
  • Symbol.iterator ์•ˆ์— ์ •์˜ ๋˜์–ด ์žˆ๋‹ค.
const arr = [1, 2];
const iterator = arr[Symbol.iterator]();

console.log(iterator.next()); // {value: 1, done: false }
console.log(iterator.next()); // {value: 2, done: false }
console.log(iterator.next()); // {value: undefined, done: true}

์‚ฌ์šฉ์ž ์ •์˜ ์ดํ„ฐ๋Ÿฌ๋ธ”

const iterable = {
  // Symbol.iterator ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜
  [Symbol.iterator]() {
    let i = 3;

    // Symbol.iterator ๋ฉ”์„œ๋“œ์™€ next ๋ฉ”์„œ๋“œ๋ฅผ ์†Œ์œ ํ•œ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ฉด์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์ธ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
    return {
      next() {
        return i == 0 ? { done: true } : { value: i--, done: false }
      },
      [Symbol.iterator]() {
        return this;
      }
    }
  }
}

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

์ดํ„ฐ๋ ˆ์ดํ„ฐ์ด์ž ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋ ค๋ฉด '์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜'๋ผ ๋ถˆ๋ฆฌ๋Š” function* ์ด ํ•„์š”ํ•˜๋‹ค.

function* gen() {
  yield 1;
  yield 2;
  yield 3;
}

let iter = gen();
log(iter[Symbol.iterator]() === iter); // true

์—ฌ๊ธฐ์„œ ์ž ๊น ๐Ÿ–๐Ÿป

์–ด์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ๋ฑ์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด์•˜๋‹ค.
๋ฑ ํด๋ž˜์Šค ์ค‘ ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ์—ˆ๋‹ค.

class Node {
  prev = null;
  next = null;
  constructor(value) {
    this.value = value;
  }
}

class Deque {
  constructor() {
    this.head = null;
    this.tail = null;
    this.length = 0;
  }
	
  .
  .
  .

  *[Symbol.iterator]() {
    let tmp = this.head;
    while (tmp) {
      yield tmp.value;
      tmp = tmp.next;
    }
  }
}


console.log([...deque]);

๋ถ„๋ช… ์–ด์ œ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ์—๋Š” ์ €๊ฒŒ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…์„ ๋ณด์•„๋„ ์ดํ•ด๊ฐ€ ๊ฐ€์ง€ ์•Š์•˜์—ˆ๋‹ค. ์˜ค๋Š˜ ๊ณต๋ถ€ํ›„์— ๋‹ค์‹œ ๋ณด๋‹ˆ ์ดํ•ด๊ฐ€ ๋˜์—ˆ๋‹ค. ๋ฑ ์•ˆ์— ์›์†Œ๋ฅผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋Š”๋ฐ ๊ทธ ๋ฆฌ์ŠคํŠธ๋ฅผ ํŽธํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ์˜€๋‹ค.
์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์‹ ๊ธฐํ•˜์˜€๋‹ค.๐Ÿ˜ฎ

๐Ÿ˜์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

์˜ค๋Š˜ ๋ฐฐ์šด ๋‚ด์šฉ ์ „๋ถ€.. ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ์ด๋‹ค. ๋จธ์“ฑ ๐Ÿ˜…

๐Ÿ”ฅ ๋Š๋‚€์ 

์ดํ„ฐ๋Ÿฌ๋ธ”๊ณผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ! ๊ทธ๋ฆฌ๊ณ  ์ œ๋„ˆ๋ ˆ์ดํ„ฐ! ๋“ค์–ด๋ณธ ์ ๋งŒ ์žˆ์—ˆ๋˜ ๊ฐœ๋…๋“ค์„ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์› ๋‹ค. ์†”์งํžˆ ์žฌ๋ฏธ์žˆ์—ˆ๋‹ค. ์ƒˆ๋กญ๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐฐ์šด๋‹ค๋Š” ๊ฒƒ์€ ์ฆ๊ฑฐ์šด ์ผ์ด๋‹ค!๐Ÿ’•

์‚ฌ์‹ค ์œ„์— ๋‚ด์šฉ ๋ง๊ณ ๋„ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ๋„ ๋ฐฐ์› ๋‹ค.
์ง„์งœ ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ ์ค‘ ํฐ ์ˆ˜ ๋งŒ๋“ค๊ธฐ๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š”๋ฐ 3์‹œ๊ฐ„์ด๋‚˜ ๊ฑธ๋ ธ๋‹ค. ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์—ญ์‹œ ๋งŽ์ด ํ’€์–ด๋ณด๋Š” ๊ฒƒ ๋ง๊ณ ๋Š” ๋‹ต์ด ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ง€๊ธˆ์ฒ˜๋Ÿผ ๊พธ์ค€ํžˆ ํ•˜์ž

๋ณต์Šต!!ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋Š˜ ๋ฐฐ์› ๋˜ ๋‚ด์šฉ๋„ ๊ณง ์žŠํ˜€์งˆํ…Œ๋‹ˆ ์ž์ฃผ ํ›‘์–ด๋ณด์ž! ํ•  ๊ฒƒ์ด ๋งŽ์•„๋„ ๋†“์น˜์ง€ ์•Š๊ฒŒ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ฑ™๊ฒจ๋‚˜๊ฐ€์ž!

๐Ÿ—ฃ ์˜ค๋Š˜์˜ TMI

์ž„์‹œํŒ€์ด ์ด๋ฒˆ์ฃผ๊นŒ์ง€๋งŒ ์ง„ํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋„ˆ๋ฌด๋„ˆ๋ฌด ์•„์‰ฝ๋‹ค.๐Ÿ˜ญ ๋„ˆ๋ฌด ์งง์€ ๊ฒƒ ์•„๋‹Œ๊ฐ€ใ… ใ…  ์ด์ œ ์ข€ ์„œ๋กœ ์ต์ˆ™ํ•ด์งˆ ๋•Œ ์ฏค ๋ฐ”๋€๋‹ค๋‹ˆ!!
์ƒˆ๋กœ์šด ๋ถ„๋“ค์„ ์•„๋Š” ๊ฒƒ๋„ ๋ฌผ๋ก  ์ข‹์ง€๋งŒ ์•„์‰ฌ์›€์€ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค!
ํ•˜์ง€๋งŒ ๊ดœ์ฐฎ์•„! ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์ถฉ๋ถ„ํžˆ ๋ณผ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ!!๐Ÿค—

2์ฃผ์ฐจ์— ์ ‘์–ด ๋“ค์—ˆ๊ณ  ํ•˜๋ฃจ๊ฐ€ ์ง€๋‚ฌ๋‹ค. ๋‚จ์€ ๊ธฐ๊ฐ„์—๋„ ํ›„ํšŒํ•˜์ง€ ์•Š๋„๋ก ์—ด์‹ฌํžˆ ํ•˜์ž

Refer

๋„์„œ > ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ
์‚ฌ์ดํŠธ > ์ œ๋„ˆ๋ ˆ์ดํ„ฐ

์˜ค๋Š˜์˜ ๋‚ด์šฉ ์ •๋ฆฌ

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

profile
๋งค ์ˆœ๊ฐ„ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2022๋…„ 3์›” 28์ผ

์˜ค๋Š˜๋„ ์„ฑ์žฅ์— ์„ฑ๊ณตํ•˜์…จ๊ตฐ์š”... ใ…œใ…œ ์ €๋Š”...๐Ÿ˜‚

1๊ฐœ์˜ ๋‹ต๊ธ€