์ฑ <๋ฌ๋์๋ฐ์คํฌ๋ฆฝํธ>๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ๋ฐฐ์ด ์๋ฐ์คํฌ๋ฆฝํธ ๋ด์ฉ์ ๋๋ค.
๋ชฉ์ฐจ
- <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") - ์ญํ ์ ๊ฑฐ
'๐ฐ ์ธ์ด > JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น๋๊ธฐ์ ํ๋ก๊ทธ๋๋ฐ(1) - ๋๊ธฐvs๋น๋๊ธฐ, ์ฝ๋ฐฑ (0) | 2020.01.14 |
---|---|
ES6์ ์ฌ๋ณผ, ์ดํฐ๋ ์ดํฐ์ ์ ๋ค๋ ์ดํฐ (0) | 2020.01.14 |
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP) (0) | 2020.01.05 |
๊ฐ์ฒด ์งํฅ ์ธ์ด - ํ๋กํ ํ์ ๊ธฐ๋ฐ ์ธ์ด(JS) (0) | 2020.01.04 |
๋ฐฐ์ด๊ณผ ๋ฐฐ์ด์ฒ๋ฆฌ (0) | 2020.01.03 |