JavaScript์˜ Set์€ **์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ(Collection)**์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์ค‘๋ณต ์—†์Œ, ์ˆœ์„œ ์œ ์ง€, ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผ ๋ถˆ๊ฐ€, ๋น ๋ฅธ ๊ฒ€์ƒ‰์ด๋ผ๋Š” ํŠน์ง•์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.


1๏ธโƒฃ Set() ๊ธฐ๋ณธ ์ •์˜

const mySet = new Set([1, 2, 3, 3]);

console.log(mySet);
// Set(3) {1, 2, 3}
  • ์ค‘๋ณต๋œ ๊ฐ’ 3์€ ์ž๋™ ์ œ๊ฑฐ๋จ
  • ์ˆซ์ž, ๋ฌธ์ž์—ด, ๊ฐ์ฒด, ๋ฐฐ์—ด ๋“ฑ ๋ชจ๋“  ํƒ€์ž… ์ €์žฅ ๊ฐ€๋Šฅ

2๏ธโƒฃ Set์˜ ํ•ต์‹ฌ ๋ฉ”์„œ๋“œ (CRUD)

๋ฉ”์„œ๋“œ ์„ค๋ช… ์˜ˆ์‹œ
add(value) ๊ฐ’ ์ถ”๊ฐ€ (์ค‘๋ณต ์‹œ ๋ฌด์‹œ) set.add(10)
delete(value) ๊ฐ’ ์‚ญ์ œ set.delete(10)
has(value) ๊ฐ’ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ set.has(10)
clear() ๋ชจ๋“  ๊ฐ’ ์‚ญ์ œ set.clear()
size (์†์„ฑ) Set์˜ ์›์†Œ ๊ฐœ์ˆ˜ set.size

๐Ÿ“Œ ์˜ˆ์ œ

const s = new Set();

s.add(1);
s.add(2);
s.add(2); // ์ค‘๋ณต โ†’ ๋ฌด์‹œ๋จ

console.log(s.has(2)); // true
console.log(s.size);   // 2

s.delete(1);
console.log(s);        // Set {2}

s.clear();
console.log(s);        // Set {}

3๏ธโƒฃ Set ๋ฐ˜๋ณต(iteration) ๊ด€๋ จ ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ ์„ค๋ช…
forEach(callback) ๊ฐ ์š”์†Œ ๋ฐ˜๋ณต ์‹คํ–‰
keys() key ๋ชฉ๋ก ๋ฐ˜๋ณต์ž (Set์—์„œ๋Š” value์™€ ๋™์ผ)
values() value ๋ชฉ๋ก ๋ฐ˜๋ณต์ž
entries() [value, value]์˜ ๋ฐฐ์—ด ์Œ ๋ฐ˜ํ™˜
Symbol.iterator for...of ๋ฐ˜๋ณต ์ง€์›

โ–ถ๏ธ forEach()

const s = new Set(["a", "b", "c"]);

s.forEach((value, sameValue, set) => {
  console.log(value);
});

โš ๏ธ Set์€ key๊ฐ€ ์—†์œผ๋ฏ€๋กœ
value์™€ sameValue๋Š” ํ•ญ์ƒ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.


โ–ถ๏ธ keys()

const s = new Set([1, 2, 3]);

console.log([...s.keys()]);
// [1, 2, 3]

โ–ถ๏ธ values()

console.log([...s.values()]);
// [1, 2, 3]

โ–ถ๏ธ entries()

console.log([...s.entries()]);
// [[1,1], [2,2], [3,3]]

โ–ถ๏ธ forโ€ฆof (Symbol.iterator)

for (const v of s) {
  console.log(v);
}
// 1
// 2
// 3

4๏ธโƒฃ Set์—๋Š” ์—†๋Š” ๋ฉ”์„œ๋“œ (์ค‘์š”โ—)

์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ์ด์œ 
โŒ map() ๋ฐฐ์—ด ์ „์šฉ
โŒ filter() ๋ฐฐ์—ด ์ „์šฉ
โŒ reduce() ๋ฐฐ์—ด ์ „์šฉ
โŒ sort() ์ •๋ ฌ ๋ถˆ๊ฐ€ ๊ตฌ์กฐ

ํ•˜์ง€๋งŒ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ ํ›„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๐Ÿ‘‡

const s = new Set([3, 1, 2]);
const sorted = [...s].sort((a, b) => a - b);

console.log(sorted); // [1, 2, 3]

5๏ธโƒฃ Set์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์‹ค์ „ ์˜ˆ์‹œ

๐Ÿ“Œ 1) ๋ฐฐ์—ด ์ค‘๋ณต ์ œ๊ฑฐ

const arr = [1, 2, 2, 3];
const unique = [...new Set(arr)];

console.log(unique); // [1, 2, 3]

๐Ÿ“Œ 2) ๊ต์ง‘ํ•ฉ (intersection)

const a = new Set([1, 2, 3]);
const b = new Set([2, 3, 4]);

const intersection = [...a].filter(x => b.has(x));

console.log(intersection); // [2, 3]

๐Ÿ“Œ 3) ํ•ฉ์ง‘ํ•ฉ (union)

const union = [...new Set([...a, ...b])];

console.log(union); // [1, 2, 3, 4]

๐Ÿ“Œ 4) ์ฐจ์ง‘ํ•ฉ (difference)

const difference = [...a].filter(x => !b.has(x));

console.log(difference); // [1]

๐Ÿง  ์ตœ์ข… ์ •๋ฆฌ

์ข…๋ฅ˜ ๋ฉ”์„œ๋“œ
๊ธฐ๋ณธ ์กฐ์ž‘ add, delete, has, clear, size
๋ฐ˜๋ณต ๊ด€๋ จ forEach, keys, values, entries, Symbol.iterator
์—†๋Š” ๊ฒƒ map, filter, reduce, sort
์ž์ฃผ ์“ฐ๋Š” ํŒจํ„ด ๋ฐฐ์—ด ์ค‘๋ณต ์ œ๊ฑฐ, ํ•ฉ์ง‘ํ•ฉ, ๊ต์ง‘ํ•ฉ, ์ฐจ์ง‘ํ•ฉ

Set์€ ์ค‘๋ณต ์ œ๊ฑฐ, ๋น ๋ฅธ ๊ฒ€์ƒ‰, ์ง‘ํ•ฉ ์—ฐ์‚ฐ์—์„œ ์••๋„์ ์œผ๋กœ ๊ฐ•๋ ฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค ๐Ÿš€