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

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

map๊ณผ set

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

 

๋ชฉ์ฐจ

  • <Map>
  • 1. Map
  • 1-1) Map vs Object
  • 2. WeakMap
  • 2-2) WeakMap vs Map
  • <Set>
  • 3. Set 

 

<Map>

1. Map

  • Map ๊ฐ์ฒด๋Š” ์š”์†Œ์˜ ์‚ฝ์ž… ์ˆœ์„œ๋Œ€๋กœ ์›์†Œ๋ฅผ ์ˆœํšŒํ•œ๋‹ค. 
  • for...of ๋ฐ˜๋ณต๋ฌธ์€ ๊ฐ ์ˆœํšŒ์—์„œ [key, value]๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
const u1 = {name : 'jackson'}
const u2 = {name : 'olive'}

//๋งต ์ƒ์„ฑ
const userRoles = new Map();

//๋งต์˜ set() ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ์—ญํ•  ํ• ๋‹น
######
userRoles.set(u1, 'User')
userRoles.set(u2, 'Admin')
###๋˜๋Š”###
userRoles
    .set(u1, 'User')
    .set(u2, 'Admin')
###๋˜๋Š”### - ์ƒ์„ฑ์ž์— ๋ฐฐ์—ด์˜ ๋ฐฐ์—ด์„ ๋„˜๊ธฐ๋Š” ํ˜•ํƒœ
const userRoles = new Map ([
    [u1, 'User']
    [u2, 'Admin']
]);

//๋งต ๋ฉ”์†Œ๋“œ
userRoles.has(u2);   - ๋งต์— ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋Š”๊ฐ€
userRoles.get(u2);   - u2์˜ ์—ญํ• ์€ ๋ฌด์—‡์ธ๊ฐ€
userRoles.set(u2, 'Users');    - ๋งต์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ‚ค์˜ ๊ฐ’ ๊ต์ฒด
userRoles.size;    - ๋งต์˜ ์š”์†Œ ์ˆซ์ž ๋ณ€ํ™˜
userRoles.delete(u2);   - ์š”์†Œ ์‚ญ์ œ
userRoles.clear();      - ๋ชจ๋“  ์š”์†Œ ์‚ญ์ œ

//๋งต ์ˆœํ™˜ ํ•˜๊ธฐ
for (var key of userRoles.keys()) {
  console.log(key);
}

for (var value of userRoles.values()) {
  console.log(value);
}

for (var [key, value] of userRoles.entries()) {
  console.log(key + " = " + value);
}

 

1-1) Map vs Object

Object๋Š” ๊ฐ’์— ํ‚ค๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ ํ‚ค๋กœ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๊ณ , ํ‚ค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์–ด๋–ค ํ‚ค์— ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ Maps์™€ ์œ ์‚ฌํ•จ.

  • Object์˜ ํ‚ค์—๋Š” String๊ณผ Symbol์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Map์€ ์–ด๋–ค ๊ฐ’๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • Map์˜ ํ‚ค๋Š” ์‚ฝ์ž…์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— (Object์˜ ํ‚ค๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.) Map์„ ์ˆœํšŒํ•˜๋ฉด ํ‚ค๋ฅผ ์‚ฝ์ž…ํ•œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.  ํ•˜์ง€๋งŒ, Object๋ฅผ ์ˆœํšŒํ•˜๋ ค๋ฉด ์–ด๋–ค ๋ฐฉ๋ฒ•์ด๋“  ํ‚ค์˜ ๋ฐฐ์—ด์„ ์–ป๊ณ , ๊ทธ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•ด์•ผ ํ•œ๋‹ค.
  • Map์˜ ํฌ๊ธฐ๋Š” size ์†์„ฑ์œผ๋กœ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ Object์˜ ์†์„ฑ ์ˆ˜๋Š” ์ง์ ‘ ํŒ๋ณ„ํ•ด์•ผํ•œ๋‹ค.
  • ์žฆ์€ ํ‚ค์˜ ์ถ”๊ฐ€์™€ ์ œ๊ฑฐ๊ฐ€ ํ•„์š”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” Map์ด ์ ํ•ฉํ•˜๋‹ค.

 

 

2. WeakMap

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์–ด๋”˜๊ฐ€์— ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋ ค๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์œ„ํฌ๋งต์€ ๊ทธ๋ ‡์ง€ ์•Š์•„ ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰์…˜ ์ค‘์ธ ๊ฐ์ฒด๋ฅผ ๋…ธ์ถœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ํฌ๋งต์€ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ๋  ์ˆ˜ ์—†๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์ง• ๋•Œ๋ฌธ์— ์œ„ํฌ๋งต์€ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ์ „์šฉ ํ‚ค๋ฅผ ์ €์žฅํ•˜๊ธฐ์— ์ข‹๋‹ค.

const SecretHolder = (function () {
    const secrets = new WeakMap();
    return class {
        setSecret(secret){
            secrets.set(this, secret);
        }
        getSecret(){
            return secrets.get(this);
        }
    }
})();

const a = new SecretHolder();
const b = new SecretHolder();

a.setSecret('secret A');
b.setSecret('secret B');

console.log(a.getSecret());
console.log(b.getSecret());

WeakMap์„ Map์œผ๋กœ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด SecretHolder ์ธ์Šคํ„ด์Šค์— ์ €์žฅ๋œ ๋‚ด์šฉ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค. (๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์† ๋– ์žˆ๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ)

 

2-2) WeakMap vs Map

  • WeakMap์˜ ์€ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ์•„๋‹ˆ๋ฉฐ, clear()์ด ์—†๋‹ค.

 

<Set>

3. set 

  • set์€ ๊ฐ์ฒด๋Š” ๊ฐ’ ์ฝœ๋ ‰์…˜์œผ๋กœ, ์‚ฝ์ž… ์ˆœ์„œ๋Œ€๋กœ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋‚˜์˜ Set ๋‚ด ๊ฐ’์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์…‹์˜ ์žฅ์ ์€ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒƒ์ด ์…‹์— ์ด๋ฏธ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฏธ ์žˆ์œผ๋ฉด ์•„๋ฌด๋Ÿฐ ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
//set ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
const roles = new Set();

//set ๋ฉ”์†Œ๋“œ
roles.add("User");  - ์‚ฌ์šฉ์ž ์—ญํ•  ์ถ”๊ฐ€
roles.add("Admin"); - ์œ„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ด€๋ฆฌ์ž ์—ญํ•  ์ถ”๊ฐ€
roles.size; 
roles.delete("Admin")  - ์—ญํ•  ์ œ๊ฑฐ