๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ฐ ์–ธ์–ด/JS

ES6์˜ ์‹ฌ๋ณผ, ์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ์ œ๋„ค๋ ˆ์ดํ„ฐ

์ฑ… <๋Ÿฌ๋‹์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ>๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๋ฐฐ์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

๋ชฉ์ฐจ

  • <์‹ฌ๋ณผ>
    1. Symbol
    2. ์‹ฌ๋ณผ์˜ ์ƒ์„ฑ
    2-1) ๋Œ€ํ‘œ์ ์ธ ์ƒ์šฉ์‹ฌ๋ณผ
  • <์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ>
    1. ์ดํ„ฐ๋ ˆ์ดํ„ฐ(Iteratoe)
    1-1) ์ดํ„ฐ๋ ˆ์ด์…˜ ํ”„๋กœํ† ์ฝœ
    2. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ(generator)

 

<์‹ฌ๋ณผ>

1. Symbol

  • ES6์—์„œ ์ƒˆ๋กœ ์„ ๋ณด์ธ ์›์‹œ ํƒ€์ž…์ด๋‹ค.  
typeof Symbol(); // 'symbol'
  • ๊ฐ์ฒด์— Uniqueํ•œ ์†์„ฑ์„ ๋งŒ๋“ค์–ด ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์ถฉ๋Œ์„ ๋ง‰๊ธฐ ์œ„ํ•ด Symbol์ด ํ•„์š”ํ•˜๋‹ค.
  • ์›๋ž˜ ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„์€ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ Array ๊ฐ™์ด ๋ฒ”์šฉ์ ์œผ๋กœ ์“ฐ์ด๋Š” ํƒ€์ž…์„ ํ™•์žฅํ–ˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ,
  1. ๋‚ด๊ฐ€ ํ™•์žฅํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ํ™•์žฅํ–ˆ๋‹ค๋ฉด? ์‹ฌ๋ณผ์€ Uniqueํ•˜๊ธฐ ๋•Œ๋ฌธ์—, description์ด ๊ฐ™์•„๋„ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. ๋‚ด๊ฐ€ Array์˜ ์†์„ฑ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์„ธ๊ณ  ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด? ์‹ฌ๋ณผ์€ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ˆœํšŒํ•˜๋Š” for in, Object.keys(obj), Object.getOwnPropertyNames(obj)์— ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

 

 

2. ์‹ฌ๋ณผ์˜ ์ƒ์„ฑ

์‹ฌ๋ณผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Symbol('some') : ๊ณ ์œ ํ•œ ์‹ฌ๋ณผ์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • Symbol.for('some') : ์‹ฌ๋ณผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ lookupํ•˜์—ฌ description์ด ๊ฐ™์œผ๋ฉด ๋งค๋ฒˆ ๊ฐ™์€ ์‹ฌ๋ณผ์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • ์ƒ์šฉ ์‹ฌ๋ณผ : Symbol.iterator์™€ ๊ฐ™์ด ํ‘œ์ค€์— ์ •์˜๋œ ์‹ฌ๋ณผ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ƒ์šฉ ์‹ฌ๋ณผ์€ ํŠน๋ณ„ํ•œ ์šฉ๋„๋ฅผ ์œ„ํ•ด์„œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ ๊ฒƒ์ด๋‹ค.

 

2-1) ๋Œ€ํ‘œ์ ์ธ ์ƒ์šฉ ์‹ฌ๋ณผ

  • Symbol.iterator : ์ดํ„ฐ๋Ÿฌ๋ธ”ํ•œ ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ์‹ฌ๋ณผ
  • Symbol.hasInstance : instanceof๋ฅผ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ์‹ฌ๋ณผ
  • Symbol.match : str.match(obj) ๋ฉ”์†Œ๋“œ๋Š” obj๋ฅผ ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ์ด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ์‹ฌ๋ณผ

โ€ป์ƒ์šฉ ์‹ฌ๋ณผ์€ Symbol.match ๋Œ€์‹  @@match๋กœ ํ‘œ๊ธฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

<์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ>

1. ์ดํ„ฐ๋ ˆ์ดํ„ฐ(Iterator) 

  • ๋ฐ˜๋ณต์„ ์œ„ํ•ด ์„ค๊ณ„๋œ, ํŠน๋ณ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด์ด๋‹ค.
  • ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋Š” next()๋ฅผ ๊ฐ€์ง€๊ณ , ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. { value: value, done: boolean } 
  • ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ '์ง€๊ธˆ ์–ด๋”” ์žˆ๋Š”๊ฐ€' ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ๋‚˜์—ดํ•  ๋ชฉ์ ์ด๋ผ๋ฉด for๋ฃจํ”„๋‚˜ for of๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
const it = book.values();
let current = it.next();
while(!current.done){
    console.log(current.value)
    current = it.next();
}
  • ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๋ชจ๋‘ ๋…๋ฆฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ์ฒ˜์Œ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค.
  • ๊ฐ๊ฐ ๋‹ค๋ฅธ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
const it1 = book values();
const it2 = book values();

 

1-1) ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ : ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ iterable ๊ฐ์ฒด(์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด)๋กœ ๋ฐ”๊ฟˆ

[Symbol.iterator](){
    return this.๊ฐ์ฒด.values();
}

 

 

2. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ(generator)

  • ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ž์‹ ์˜ ์‹คํ–‰์„ ์ œ์–ดํ•˜๋Š” ํ•จ์ˆ˜
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ๋„์ž…ํ•œ ๋‘ ๊ฐ€์ง€ ๊ฐœ๋…
  1. ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ๊ฐœ๋ณ„์  ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ”์œผ๋กœ์จ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์ œ์–ดํ•œ๋‹ค.
  2. ์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜์™€ ํ†ต์‹ ํ•œ๋‹ค
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ (vs ํ•จ์ˆ˜)
  1. ์–ธ์ œ๋“  ํ˜ธ์ถœ์ž์—๊ฒŒ ์ œ์–ด๊ถŒ ๋„˜๊ธธ ์ˆ˜ ์žˆ์Œ.(yield๋กœ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ ํ˜ธ์ถœ์ž ์‚ฌ์ด์—์„œ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ๊ฐ€๋Šฅ)
  2. ํ˜ธ์ถœํ•œ ์ฆ‰์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์ง€๋งŒ, ๋Œ€์‹  ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฐ˜ํ™˜, ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ next๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์‹คํ–‰๋จ.
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” function*(ํ™”์‚ดํ‘œ ํ‘œ๊ธฐ๋ฒ• ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ.)
  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์—์„  return์™ธ์— yield ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ 
function* rainbow(){
    yield 'red';    # ํ˜ธ์ถœ์ž it์ด nextํ˜ธ์ถœํ•ด์•ผ ์ด ํ–‰์ด ์‹คํ–‰๋˜๊ณ 
    yield 'orange';   # ๋‹ค์Œ nextํ˜ธ์ถœ ๋•Œ์— ์ด ํ–‰์ด ์‹คํ–‰๋จ.
}

const it = rainbow();
it.next(); // {value : 'red', done : false}
it.next(); // {value : 'orange', done : false}
it.next(); // {value : undefined, done : true}