Map
1. ๊ฐ์
ES6๋ถํฐ ๋์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด์ธ ๋งต(Map)๊ณผ ์ (Set)์ ๊ธฐ์กด์ ์๋ฃ๊ตฌ์กฐ์ธ ๊ฐ์ฒด์ ๋ฐฐ์ด๊ณผ ๋น์ทํ์ง๋ง ์ฐจ์ด์ ์ด ๋ถ๋ช ์กด์ฌํฉ๋๋ค. ์ด๋ฒ ์ฑํฐ์์๋ ๊ฐ์ฒด์ ๋ฐฐ์ด๊ณผ ๋ค๋ฅธ ๋งต๊ณผ ์ ์ ํน์ง์ ์์๋ณด์.
2. Object vs Map
Object์ ํค๋ String์ด๋ฉฐ, Map์ ๋ฌธ์์ด์ด ์๋ ๊ฐ๋ ํค๋ก ์ค์ ํ ์ ์๋ค.
Map์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
Map์ ์ถ๊ฐ๋ ์์๋๋ก ๋ฐ๋ณตํ๋ค.
3. ๋งต(Map) ๊ฐ์ฒด ์์ฑ
๋งต์ ํค๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค๋ ์ ์์ ๊ฐ์ฒด์ ์ ์ฌํ์ง๋ง ๋งต์ ํค์ ๋ค์ํ ์๋ฃํ์ ํ์ฉํ๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์๋ค.
๋จผ์ ๋งต ๊ฐ์ฒด ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์.
3-1. ๋น Map ๊ฐ์ฒด ์์ฑ
let map = new Map();
3-2. [ํค, ๊ฐ] ํํ์ ์ค์ฒฉ ๋ฐฐ์ด์ ์ ๋ฌํ์ฌ Map ๊ฐ์ฒด ์์ฑ
๊ธฐ๋ณธ ์์ฑ ๋ฐฉ๋ฒ
let map = new Map([ ["A", "valueA"], ["B", "valueB"], ["C", "valueC"], ]);
๋ง์ฝ, ์ค๋ณต๋๋ ํค๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ๋ง์ง๋ง ๊ฐ์ด ์ ์ฉ๋๋ค.
let map = new Map([ ["A", "valueA"], ["B", "valueB"], ["C", "valueC"], ["B", "valueBB"], ]);
[ํค, ๊ฐ]์์ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋ ์ ์๋ค.
let map = new Map([ ["A", { value: "valueA" }], ["B", { value: "valueB" }], ["C", { value: "valueC" }], ]);
[ํค, ๊ฐ]์์ ํค๋ ๊ฐ์ฒด๊ฐ ๋ ์ ์์ง๋ง ๊ณ ์ ํ ๊ฐ์ด ๋ ์ ์๋ค.
let map = new Map([ [{ key: "A" }, { value: "valueA" }], [{ key: "B" }, { value: "valueB" }], [{ key: "C" }, { value: "valueC" }], [{ key: "B" }, { value: "valueBB" }], ]);
3-3. Map.set(key, value): key๋ฅผ ์ด์ฉํด value๋ฅผ ์ ์ฅ
๊ธฐ๋ณธ ์ฌ์ฉ ๋ฐฉ๋ฒ
let map = new Map(); map.set("A", "valueA"); map.set("B", "valueB"); map.set("C", "valueC");
์ฒด์ด๋ ๋ฐฉ๋ฒ
map.set์ ํธ์ถํ ๋๋ง๋ค ๋งต ์์ ์ด ๋ฐํ๋๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌmap.set์ ์ฒด์ด๋(chaining)ํ ์ ์๋ค.let map = new Map(); map.set("A", "valueA").set("B", "valueB").set("C", "valueC");
3-4. Object.entries(obj): ํ๋ฒํ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ๋งต(Map) ๋ง๋ค๊ธฐ
ํ๋ฒํ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ๋งต(Map)์ ๋ง๋ค๊ณ ์ถ์ผ๋ฉด ๋ด์ฅ ๋ฉ์๋ Object.entries(obj)๋ฅผ ํ์ฉํด์ผ ํ๋ค. ์ด ๋ฉ์๋๋ ๊ฐ์ฒด์ ํค-๊ฐ ์์ ์์([key, value])๋ก ๊ฐ์ง๋ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ํ๋ฒํ ๊ฐ์ฒด๊ฐ ์๋ค.
const obj = {
name: "HD",
age: 29,
gender: "male",
};์์ obj๊ฐ์ฒด๋ฅผ Object.entries(obj)์ ์ธ์๋ก ๋ฃ๊ฒ ๋๋ฉด ํค-๊ฐ ์์ ์์([key, value])๋ก ๊ฐ์ง๋ ๋ฐฐ์ด์ ๋ฐํํ๋ค. (์๋์ ์ฝ๋ ๋ฐ ์ฌ์ง ์ฐธ๊ณ )
const entries = Object.entries(obj);
entreis์ ๊ฐ ์์๊ฐ [ํค, ๊ฐ] ์์ธ ๋ฐฐ์ด์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก new Map()์ ์ ๋ฌํ์ฌ ์๋ก์ด ๋งต์ ๋ง๋ค ์ ์๋ค.
const map = new Map(entries);
4. Map์ ์ฃผ์ ๋ฉ์๋์ ํ๋กํผํฐ
4-1. Map.get(key)
key์ ํด๋นํ๋ ๊ฐ์ ๋ฐํํ๋ค. key๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด undefined๋ฅผ ๋ฐํํ๋ค.
let map = new Map();
map.set("name", "HD").set("age", 29);
console.log(map.get("name"));
console.log(map.get("gender"));
map์ ์ฌ์ฉํ ๋map์ ์ฉ ๋ฉ์๋set,get๋ฑ์ ์ฌ์ฉํ์. ๊ธฐ์กด ๊ฐ์ฒด์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์map์ ์ผ๋ฐ ๊ฐ์ฒด์ฒ๋ผ ์ทจ๊ธํ๊ฒ ๋์ด ์ฌ๋ฌ ์ ์ฝ์ด ์๊ธด๋ค.
4-2. Map.has(key)
key๊ฐ ์กด์ฌํ๋ฉด true, ์กด์ฌํ์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํ๋ค.
let map = new Map([
["A", "valueA"],
["B", "valueB"],
["C", "valueC"],
["D", "valueD"],
["E", "valueE"],
]);
console.log(map.has("A"));
console.log(map.has("C"));
console.log(map.has("F"));
4-3. Map.delete(key)
key์ ํด๋นํ๋ ๊ฐ์ ์ญ์ ํ๋ค.
let map = new Map([
["A", "valueA"],
["B", "valueB"],
["C", "valueC"],
["D", "valueD"],
["E", "valueE"],
]);
console.log(map.has("C"));
map.delete("C");
console.log(map.has("C"));
4-4. Map.clear()
๋งต ์์ ๋ชจ๋ ์์๋ฅผ ์ ๊ฑฐํ๋ค.
let map = new Map([
["A", "valueA"],
["B", "valueB"],
["C", "valueC"],
["D", "valueD"],
["E", "valueE"],
]);
map.clear();
console.log(map);
4-5. Map.size
์์์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
let map = new Map([
["A", "valueA"],
["B", "valueB"],
["C", "valueC"],
["D", "valueD"],
["E", "valueE"],
]);
console.log(map.size);
4-6. Map.keys()
๊ฐ ์์์ ํค๋ฅผ ๋ชจ์ ๋ฐ๋ณต ๊ฐ๋ฅํ(iterable, ์ดํฐ๋ฌ๋ธ) ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
let map = new Map([
["A", "valueA"],
["B", "valueB"],
["C", "valueC"],
["D", "valueD"],
["E", "valueE"],
]);
console.log(map.keys());
4-7. Map.values()
๊ฐ ์์์ ๊ฐ์ ๋ชจ๋ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
let map = new Map([
["A", "valueA"],
["B", "valueB"],
["C", "valueC"],
["D", "valueD"],
["E", "valueE"],
]);
console.log(map.values());
4-8. Map.entries()
์์์ [ํค, ๊ฐ]์ ํ ์์ผ๋ก ํ๋ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์ด ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ for...of๋ฐ๋ณต๋ฌธ์ ๊ธฐ์ด๋ก ์ฐ์ธ๋ค.
let map = new Map([
["A", "valueA"],
["B", "valueB"],
["C", "valueC"],
["D", "valueD"],
["E", "valueE"],
]);
console.log(map.entries());
์๋๋ for...of๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ฌ [ํค, ๊ฐ] ์์ ๋์์ผ๋ก ์ํํ๋ ์ฝ๋์ด๋ค.
for ([key, value] of map.entries()) {
console.log(key, value);
}
for ([key, value] of map) {
console.log(key, value);
}๋ ๋ฐ๋ณต๋ฌธ์ ๊ฒฐ๊ณผ๋ ๊ฐ๋ค.

๋งต์ ๋ฐฐ์ด๊ณผ ์ ์ฌํ๊ฒ ๋ด์ฅ ๋ฉ์๋
forEach๋ ์ง์ํ๋ค.let map = new Map([ ["A", "valueA"], ["B", "valueB"], ["C", "valueC"], ["D", "valueD"], ["E", "valueE"], ]); map.forEach((value, index) => { console.log("value: ", value); console.log("index: ", index); });
4-9. Object.fromEntries
๋งต์ ๊ฐ์ฒด๋ก ๋ฐ๊พธ๊ธฐ ์ํด์๋ Object.fromEntries๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ด ๋ฉ์๋๋ ๊ฐ ์์๊ฐ [ํค, ๊ฐ] ์์ธ ๋ฐฐ์ด์ ๊ฐ์ฒด๋ก ๋ฐ๊ฟ์ค๋ค.
let map = new Map([
["A", "valueA"],
["B", "valueB"],
["C", "valueC"],
["D", "valueD"],
["E", "valueE"],
]);
// map.entries()๋ฅผ ํธ์ถํ๋ฉด ๋งต์ [ํค, ๊ฐ]์ ์์๋ก ๊ฐ์ง๋ ์ดํฐ๋ฌ๋ธ์ ๋ฐํํ๋ค.
// ์ด๋ฐ ๊ณผ์ ์ ๊ฑฐ์น๋ ์ด์ ๋ Object.fromEntries ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํจ์ด๋ค.
const entries = map.entries();
console.log(entries);
const obj = Object.fromEntries(entries);
console.log(obj);
ํ์ง๋ง ๊ตณ์ด map.entries()๋ฅผ ํ์ง์๊ณ Object.fromEntries() ๋ฉ์๋์ ์ธ์๋ก ๋งต(Map)์ ์ ๋ฌํด๋ ๋๋ค.
Object.fromEntries๋ ์ธ์๋ก ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ ๊ผญ ๋ฐฐ์ด์ ์ ๋ฌํด์ค ํ์๋ ์๋ค.(๋งต๋ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด์ด๋ค.)
์ฆ, ์๋์ ๊ฐ์ด ์์ ์ฝ๋๋ฅผ ์์ ํ ์ ์๋ค.
let map = new Map([
["A", "valueA"],
["B", "valueB"],
["C", "valueC"],
["D", "valueD"],
["E", "valueE"],
]);
const obj = Object.fromEntries(map);5. Conclusion
์๋
๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive์ฑ ์ ๋ณด๋ฉฐ ๊ณต๋ถํ๋ ์ ์ด ์๋ค. ๊ทธ ์ฑ ์ ๋์๋ ๋ด์ฉ ์ค ํ๋๊ฐ ๋ฐ๋ก ์ค๋ ๊ณต๋ถํ ๋งต(Map)์ ๋ํด ๋ดค๋ ๊ธฐ์ต์ด ์๋ค. ๋น์์๋ ์ ๋ง ๋~~์ถฉ ๋ณด๊ณ ๋๊ฒผ๊ธฐ ๋๋ฌธ์ ์ค๋ ๊ณต๋ถํ๋ฉด์๋ ๋ง์ด ์์ํ๊ฒ ๋๊ผ๋ค. ๋ํ ์ดํฐ๋ฌ๋ธ์ ๊ฐ์ ๊ฐ๋ ๋ ์ค๋๋ง์ ๋ณด๋ ๊ฒ์ด๊ธฐ์ ๋จธ๋ฆฌ์์ด ๋ณต์กํด์ก๋ค.๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive์ฑ ์ ๋ค์ ๋ณด๋ฉด์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํํํ ๋ค์ง ์ ์๋๋ก ํ์. ์ฒ์๋ถํฐ ๋ค์ ๋ณด๋ฉฐ ํ๋ํ๋ ๋ด ๊ฒ์ผ๋ก ๋ง๋ค์ด ๋ณด์! ์๋ง ๊ทธ ๋ ์๋ ๋ด์ฉ๋ณด๋ค๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์๋ํ๋ ์๋ฆฌ, ์์ํ ๊ฐ๋ ์ ๋จผ์ ์ ๋ฆฌํ๋ฉฐ ๊ณต๋ถํ์ง ์์๊น ์ถ๋ค. ๋งต์ ๋ํ ๋๋์ ๋ฐ๋ณต๊ฐ๋ฅํ ๊ฐ์ฒด์ด๋ฏ๋กArray.forEach()๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ด ์ ๊ธฐํ์๋ค. ๋น์ฐํfor...of๊ตฌ๋ฌธ๋ ์ฌ์ฉํ๋ ์ฝํ ๋ฅผ ํ๊ณ ๊ณต๋ถํ ๋ ๋งต์ ์ ํ๋ํ๋๋ก ํด์ผ๊ฒ ๋ค.
์ฐธ๊ณ
๋งต๊ณผ ์ [JavaScript]Map ๊ฐ์ฒด
๐ 2022-08-08
Last updated
