B24: ๋งต๊ณผ ์…‹(map & set) ๊ฐ์ฒด

2025. 8. 26. 19:54ใ†Front-end/JavaScript

๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

1. ๋งต๊ณผ ์…‹์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

2. ๋งต (map)

    2-1. ์ฃผ์š” ๋ฉ”์„œ๋“œ/ํ”„๋กœํผํ‹ฐ

    2-2. map์˜ ๋™์ž‘ ํŠน์ง•

    2-3. ๋งต์˜ ์š”์†Œ์— ๋ฐ˜๋ณต ์ž‘์—…ํ•˜๋Š” ๋ฉ”์„œ๋“œ : keys(), values(), entries()

    2-4. ๊ฐ์ฒด ↔ ๋งต : Object.entries, Object.fromEntries

3. ์…‹ (set)

    3-1. ์ฃผ์š” ๋ฉ”์„œ๋“œ

    3-2. ์…‹์˜ ์š”์†Œ์— ๋ฐ˜๋ณต ์ž‘์—…ํ•˜๋Š” ๋ฉ”์„œ๋“œ : keys(), values(), entries()


1. ๋งต๊ณผ ์…‹์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

์ง€๊ธˆ๊นŒ์ง€ ์ž๋ฃŒ๊ตฌ์กฐ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์„ ๋ณด์•˜๋‹ค.

ํ•˜์ง€๋งŒ ํ˜„์‹ค ์„ธ๊ณ„๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ์—” ๊ฐ์ฒด์™€ ๋ฐฐ์—ด๋กœ ๋ถ€์กฑํ•ด์„œ map๊ณผ set์ด ๋“ฑ์žฅํ•œ๋‹ค.

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์ฐจ์ด์ ์„ ๋ณด์ž.

  • ๊ฐ์ฒด : ํ‚ค(key)๊ฐ€ ์žˆ๋Š” ์ปฌ๋ ‰์…˜์„ ์ €์žฅ
  • ๋ฐฐ์—ด : ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ปฌ๋ ‰์…˜์„ ์ €์žฅ
  • ๋งต(map) : ํ‚ค(๋‹ค์–‘ํ•œ ์ž๋ฃŒํ˜• ํ—ˆ์šฉ)๋ฅผ ๊ฐ€์ง„ ์ปฌ๋ ‰์…˜์„ ์ €์žฅ
  • ์…‹(set) : ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ปฌ๋ ‰์…˜์„ ์ €์žฅ (ํ‚ค ์—†์Œ)

2. ๋งต (map)

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

 

1. ์ฃผ์š” ๋ฉ”์„œ๋“œ/ํ”„๋กœํผํ‹ฐ โœ…

๋ฉ”์„œ๋“œ/ํ”„๋กœํผํ‹ฐ ์—ญํ• 
new Map() ๋งต์„ ์ƒ์„ฑ
map.set(key, value) key๋กœ value๋ฅผ ์ €์žฅ
map.get(key) key์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ (์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ‚ค๋Š” undefined ๋ฐ˜ํ™˜)
map.has(key) key๊ฐ€ ์กด์žฌํ•˜๋ฉด true, ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด false ๋ฐ˜ํ™˜
map.delete(key)  key์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ์‚ญ์ œ
map.clear() ๋งต ์•ˆ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ œ๊ฑฐ
map.size() ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜

 

let john = { name: "John" };

let map = new Map();

map.set('1', 'str1');	// ๋ฌธ์žํ˜• ํ‚ค
map.set(1, num);	// ์ˆซ์žํ˜• ํ‚ค
map.set(true, 'bool1');	// ๋ถˆ๋ฆฐํ˜• ํ‚ค
map.set(john, 123);	// ๊ฐ์ฒดํ˜• ํ‚ค

console.log(map.get(1));	// 'num1'
console.log(map.get('1'));	// 'str1'
console.log(map.get(john));	// 123
console.log(map.size);	// 3

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ž๋ฃŒํ˜•์„ ํ‚ค๋กœ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—

๊ฐ์ฒด์™€ ๋‹ค๋ฅด๊ฒŒ ํ‚ค์˜ ํƒ€์ž…์„ ๋ฌธ์žํ˜•์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚ค์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ๋‹ค.

 

๊ฐ์ฒด๋ฅผ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ๋งต์˜ ์ฃผ์š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

๊ฐ์ฒด์—์„œ๋Š” ๊ฐ์ฒด ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

let john = { name: "John" };
let obj = {};

obj[john] = 123;

console.log(obj["[object Object]"] );	// 123
// ์›ํ•˜๋Š” ๊ฐ’ 123์„ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ‚ค๊ฐ€ ๋“ค์–ด๊ฐˆ ์ž๋ฆฌ์— object Object๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•จ

๊ฐ์ฒด์—์„œ ๊ฐ์ฒด๋ฅผ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ํ‚ค๋ฅผ ๋ฌธ์žํ˜•์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— john์ด ๋ฌธ์žํ˜• "[object Object]"๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

 

2. map์˜ ๋™์ž‘ ํŠน์ง• โœ…

1) ํ‚ค ๋น„๊ต ๋ฐฉ์‹

๋งต์€ SameValueZero๋ผ๋Š” ๋‚ด์žฅ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด ๊ฐ’์˜ ๋“ฑ๊ฐ€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

SameValueZero๋Š” ์ผ์น˜ ์—ฐ์‚ฐ์ž( === )์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๋‚˜, NaN๊ณผ NaN์„ ์ผ์น˜ํ•˜๋‹ค๊ณ  ์ทจ๊ธ‰ํ•œ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋งต์—์„œ๋Š” NaN๋„ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2) ์ฒด์ด๋‹

map.set์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋งต ์ž์‹ ์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

์ด๋ฅผ ์ด์šฉํ•ด map.set์„ ์ฒด์ด๋‹(chaining)ํ•  ์ˆ˜ ์žˆ๋‹ค.

map.set('1', 'str1')
    .set(1, 'num1')
    .set(true, 'bool1');

 

3) ์‚ฝ์ž… ์ˆœ์„œ์˜ ๊ธฐ์–ต

๋งต์€ ๊ฐ’์ด ์‚ฝ์ž…๋œ ์ˆœ์„œ๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค. (์ˆœํšŒ์— ์‚ฌ์šฉ)

๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ ์ˆœ์„œ๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ๊ณผ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

 

 

3. ๋งต์˜ ์š”์†Œ์— ๋ฐ˜๋ณต ์ž‘์—…ํ•˜๋Š” ๋ฉ”์„œ๋“œ : keys(), values(), entries() โœ…

์•„๋ž˜ 3๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋งต์˜ ๊ฐ ์š”์†Œ์— ๋ฐ˜๋ณต ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”์„œ๋“œ ๋™์ž‘
map.keys() ๊ฐ ์š”์†Œ์˜ ํ‚ค๋ฅผ ๋ชจ์€ iterable ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
map.values() ๊ฐ ์š”์†Œ์˜ ๊ฐ’์„ ๋ชจ์€ iterable ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
map.entries() ์š”์†Œ์˜ [ํ‚ค, ๊ฐ’]์„ ํ•œ ์Œ์œผ๋กœ ํ•˜๋Š” iterable ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜

+ ์ถ”๊ฐ€๋กœ ๋‚ด์žฅ๋ฉ”์„œ๋“œ forEach๋„ ์ง€์›ํ•œ๋‹ค.

 

let recipeMap = new Map([
  ['cucumber', 500],
  ['tomatoes', 350],
  ['onion', 50]
]);

// map.keys()
for(let vege of recipeMap.keys()) {
  console.log(vege);	// cucumber, tomatoes, onion
}

// map.values()
for(let amount of recipeMap.values()) {
  console.log(amount);	// 500, 350, 50
}

// map.entries()
for(let entry of recipeMap.entries()) {	// .entries() ์•ˆ๋ถ™์—ฌ๋„ ๋จ
  console.log(entry);	// [cucumber,500], [tomatoes,350], ...
}

// forEach()
recipeMap.forEach((value, key, map) => {
  console.log(`${key}: ${value}`);	// cucumber: 500, tomato: 350, ...
};

 

4. ๊ฐ์ฒด ↔ ๋งต : Object.entries, Object.fromEntries โœ…

๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ฐ์ฒด์™€ ๋งต์„ ์„œ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

  • Object.entries : ๊ฐ์ฒด → ๋งต
  • Object.fromEntries : ๋งต → ๊ฐ์ฒด
// Object.entries : ๊ฐ์ฒด → ๋งต
let obj = {
  name: "John",
  age: 30
};

let map = new Map(Object.entries(obj));
console.log(map(get('name'));	// John

// Object.fromEntries : ๋งต → ๊ฐ์ฒด
let map = new Map();
map.set('banana', 1);
map.set('orange', 2);
map.set('meat', 3);

let obj = Object.fromEntreis(map.entries());  // ๋งต์„ ์ผ๋ฐ˜ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜(entries() ์ƒ๋žต ๊ฐ€๋Šฅ)

console.log(obj.orange);	// 2

 

 


3. ์…‹ (set)

 set์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ ๋ชจ์•„๋†“์€ ํŠน๋ณ„ํ•œ ์ปฌ๋ ‰์…˜์œผ๋กœ, ํ‚ค๊ฐ€ ์—†๋Š” ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค.

 

1. ์ฃผ์š” ๋ฉ”์„œ๋“œ โœ…

๋ฉ”์„œ๋“œ ์—ญํ• 
new Set(iterable) ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ์ฒด(๋ณดํ†ต ๋ฐฐ์—ด)๋ฅผ ์ „๋‹ฌ ๋ฐ›์•„ ์…‹์„ ์ƒ์„ฑ
set.add(value) ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ž๊ธฐ ์ž์‹ ์„ ๋ฐ˜ํ™˜
set.delete(value) value์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ์ œ๊ฑฐ, ์„ฑ๊ณต ์‹œ true, ์‹คํŒจ ์‹œ false ๋ฐ˜ํ™˜
set.has(value) ์…‹ ๋‚ด์— ๊ฐ’ ์กด์žฌ ์‹œ true, ์•„๋‹ˆ๋ฉด false ๋ฐ˜ํ™˜
set.clear() ์…‹ ์•ˆ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ œ๊ฑฐ
set.size ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜

 

set์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, set.add(value)๋ฅผ ์—ฌ๋Ÿฌ๋ณธ ํ˜ธ์ถœํ•ด๋„ ์ค‘๋ณต ์ถ”๊ฐ€๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

let set = new Set();

let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };

set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(pete);

console.log(set.size);	// 3
for(let user of set) {
  console.log(user.name);	// John, Pete, Mary
}

 

๋ฐฐ์—ด ๋ฉ”์„œ๋“œ์ธ arr.find๋ฅผ ์ด์šฉํ•˜์—ฌ ์ค‘๋ณต ๊ฐ’ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, set๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค.

 

 

2. ์…‹์˜ ์š”์†Œ์— ๋ฐ˜๋ณต ์ž‘์—…ํ•˜๋Š” ๋ฉ”์„œ๋“œ : keys(), values(), entries() โœ…

์•„๋ž˜ 3๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์…‹์˜ ๊ฐ ์š”์†Œ์— ๋ฐ˜๋ณต ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”์„œ๋“œ ๋™์ž‘
map.keys() ๊ฐ ์š”์†Œ์˜ ํ‚ค๋ฅผ ๋ชจ์€ iterable ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
map.values() ๊ฐ ์š”์†Œ์˜ ๊ฐ’์„ ๋ชจ์€ iterable ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
map.entries() ์š”์†Œ์˜ [ํ‚ค, ๊ฐ’]์„ ํ•œ ์Œ์œผ๋กœ ํ•˜๋Š” iterable ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜

+ ์ถ”๊ฐ€๋กœ ๋‚ด์žฅ๋ฉ”์„œ๋“œ forEach๋„ ์ง€์›ํ•œ๋‹ค.

 

 

 

 

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•