Map

1. ๊ฐœ์š”

ES6๋ถ€ํ„ฐ ๋„์ž…๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด์ธ ๋งต(Map)๊ณผ ์…‹(Set)์€ ๊ธฐ์กด์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ธ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์ฐจ์ด์ ์ด ๋ถ„๋ช… ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฑ•ํ„ฐ์—์„œ๋Š” ๊ฐ์ฒด์™€ ๋ฐฐ์—ด๊ณผ ๋‹ค๋ฅธ ๋งต๊ณผ ์…‹์˜ ํŠน์ง•์„ ์•Œ์•„๋ณด์ž.


2. Object vs Map

  • Object์˜ ํ‚ค๋Š” String์ด๋ฉฐ, Map์€ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฐ’๋„ ํ‚ค๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Map์€ ํฌ๊ธฐ๋ฅผ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

  • Map์€ ์ถ”๊ฐ€๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜๋ณตํ•œ๋‹ค.


3. ๋งต(Map) ๊ฐ์ฒด ์ƒ์„ฑ

๋งต์€ ํ‚ค๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ฐ์ฒด์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋งต์€ ํ‚ค์— ๋‹ค์–‘ํ•œ ์ž๋ฃŒํ˜•์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

๋จผ์ € ๋งต ๊ฐ์ฒด ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

3-1. ๋นˆ Map ๊ฐ์ฒด ์ƒ์„ฑ

let map = new Map();
map_obj_create

3-2. [ํ‚ค, ๊ฐ’] ํ˜•ํƒœ์˜ ์ค‘์ฒฉ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜์—ฌ Map ๊ฐ์ฒด ์ƒ์„ฑ

  1. ๊ธฐ๋ณธ ์ƒ์„ฑ ๋ฐฉ๋ฒ•

    let map = new Map([
      ["A", "valueA"],
      ["B", "valueB"],
      ["C", "valueC"],
    ]);

    map_obj_create 2

  2. ๋งŒ์•ฝ, ์ค‘๋ณต๋˜๋Š” ํ‚ค๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด ์ ์šฉ๋œ๋‹ค.

    let map = new Map([
      ["A", "valueA"],
      ["B", "valueB"],
      ["C", "valueC"],
      ["B", "valueBB"],
    ]);

    map_object_create 2

  3. [ํ‚ค, ๊ฐ’]์—์„œ ๊ฐ’์€ ๊ฐ์ฒด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

    let map = new Map([
      ["A", { value: "valueA" }],
      ["B", { value: "valueB" }],
      ["C", { value: "valueC" }],
    ]);

    map_object_create 4

  4. [ํ‚ค, ๊ฐ’]์—์„œ ํ‚ค๋„ ๊ฐ์ฒด๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ ์œ ํ•œ ๊ฐ’์ด ๋  ์ˆ˜ ์—†๋‹ค.

    let map = new Map([
      [{ key: "A" }, { value: "valueA" }],
      [{ key: "B" }, { value: "valueB" }],
      [{ key: "C" }, { value: "valueC" }],
      [{ key: "B" }, { value: "valueBB" }],
    ]);

    map_object_create 5


3-3. Map.set(key, value): key๋ฅผ ์ด์šฉํ•ด value๋ฅผ ์ €์žฅ

  1. ๊ธฐ๋ณธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

    let map = new Map();
    map.set("A", "valueA");
    map.set("B", "valueB");
    map.set("C", "valueC");

    map_object_create 6

  2. ์ฒด์ด๋‹ ๋ฐฉ๋ฒ•

    map.set์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋งต ์ž์‹ ์ด ๋ฐ˜ํ™˜๋œ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ map.set์„ ์ฒด์ด๋‹(chaining)ํ•  ์ˆ˜ ์žˆ๋‹ค.

    let map = new Map();
    map.set("A", "valueA").set("B", "valueB").set("C", "valueC");

    map_object_create 7


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);
map_object_create 8

entreis์€ ๊ฐ ์š”์†Œ๊ฐ€ [ํ‚ค, ๊ฐ’] ์Œ์ธ ๋ฐฐ์—ด์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ new Map()์— ์ „๋‹ฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋งต์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

const map = new Map(entries);
map_object_create 9

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_get

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"));
map_has

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"));
map_delete

4-4. Map.clear()

๋งต ์•ˆ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

let map = new Map([
  ["A", "valueA"],
  ["B", "valueB"],
  ["C", "valueC"],
  ["D", "valueD"],
  ["E", "valueE"],
]);

map.clear();
console.log(map);
map_clear

4-5. Map.size

์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

let map = new Map([
  ["A", "valueA"],
  ["B", "valueB"],
  ["C", "valueC"],
  ["D", "valueD"],
  ["E", "valueE"],
]);

console.log(map.size);
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());
map_keys

4-7. Map.values()

๊ฐ ์š”์†Œ์˜ ๊ฐ’์„ ๋ชจ๋“  ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

let map = new Map([
  ["A", "valueA"],
  ["B", "valueB"],
  ["C", "valueC"],
  ["D", "valueD"],
  ["E", "valueE"],
]);

console.log(map.values());
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());
map_entries

์•„๋ž˜๋Š” for...of๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ [ํ‚ค, ๊ฐ’] ์Œ์„ ๋Œ€์ƒ์œผ๋กœ ์ˆœํšŒํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

for ([key, value] of map.entries()) {
  console.log(key, value);
}
for ([key, value] of map) {
  console.log(key, value);
}

๋‘ ๋ฐ˜๋ณต๋ฌธ์˜ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค.

map_entries 2

๋งต์€ ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ 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);
});

map_forEach


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_fromEntries

ํ•˜์ง€๋งŒ ๊ตณ์ด 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