[REAL Deep Dive into JS] 37. Setκ³Ό Map

young_palleteΒ·2022λ…„ 10μ›” 11일
0

REAL JavaScript Deep Dive

λͺ©λ‘ 보기
38/46
post-custom-banner

🚦 본둠

많이 μ“°λŠ” ν‘œμ€€ 빌트인 κ°μ²΄λ“€μ΄κ΅°μš”!
정말 μ• μš©ν•˜κΈ° 쒋은 μΉœκ΅¬λ“€μ΄μ—μš” πŸ₯°

Set

μœ μΌν•œ κ°’λ“€μ˜ 집합을 κ°’μœΌλ‘œ κ°€μ§‘λ‹ˆλ‹€.
μ΄λŠ” μ›λž˜ μˆ˜ν•™μ—μ„œ μ‚¬μš©λ˜λŠ” '집합'의 κ°œλ…μ—μ„œ μ°©μ•ˆλœ κ°μ²΄μ—μš”!
마치, ν•˜λ‚˜ν•˜λ‚˜μ˜ 값듀을 집합 μš”μ†ŒλΌκ³  치면, μ΄λŸ¬ν•œ μš”μ†Œλ“€μ΄ μ€‘λ³΅ν•΄μ„œ λ“€μ–΄μžˆμ§€ μ•Šλ„λ‘ ν•˜κΈ° μœ„ν•¨μ΄μ£ .

μ΄λ•Œ, 객체의 νŠΉμ„±μ„ 진~ν•˜κ²Œ κ°–κ³  μžˆλŠ”λ°μš”.
λ”°λΌμ„œ λ°°μ—΄μ²˜λŸΌ λΉ„μŠ·ν•΄λ³΄μ—¬λ„, μš”μ†Œ μˆœμ„œλ₯Ό λ”°λ‘œ μ €μž₯ν•˜μ§€ μ•Šμ•„μš”.

const set = new Set();

// ν‘œμ€€ 빌트인 '객체'인 `Set`이 이미 전역에 μ •μ˜λ˜μ–΄ 있죠!
console.log(set.constructor.name) // 'Set'

console.log(set) // Set(0) {}

Set은 μƒμ„±μ‹œ μ΄ν„°λŸ¬λΈ”μ„ 인수둜 μ „λ‹¬λ°›λŠ”λ‹€.

이게 μ€‘μš”ν•©λ‹ˆλ‹€.
Set은 μ•„λ¬΄λ‚˜ 받지 μ•Šμ•„μš”. 였직 μ΄ν„°λŸ¬λΈ”ν•œ 친ꡬ만 인수둜 전달 λ°›μŠ΅λ‹ˆλ‹€.

Set은 μ΄ν„°λŸ¬λΈ”μ„ λ°˜ν™˜ν•œλ‹€.

μ΄ν„°λŸ¬λΈ”ν•œ μΉœκ΅¬λ“€μ€ μŠ€ν”„λ ˆλ“œ 문법과 λ””μŠ€νŠΈλŸ­μ²˜λ§ 할당이 κ°€λŠ₯ν•΄μš”.
이λ₯Ό 톡해 κ·Έλƒ₯ μœ μΌν•œ 값을 λ°°μ—΄λ‘œ λ°›μ•„μ˜¬ 수 μžˆμ–΄μš”.
μ‹€μ œλ‘œ μ•Œκ³ λ¦¬μ¦˜μ΄λΌλ˜μ§€, κ΅¬ν˜„μ— μžˆμ–΄μ„œ 맀~우 μœ μš©ν•˜λ‹΅λ‹ˆλ‹€! πŸ₯°

console.log(new Set([1,2,3,4,1,2,3,4])) // [1,2,3,4]

길이

size ν”„λ‘œνΌν‹°λ₯Ό 톡해 길이λ₯Ό μ•Œ 수 μžˆμ–΄μš”!

console.log(new Set([1,2,3,4,1,2,3,4]).size) // 4

μΆ”κ°€, 검색, μ‚­μ œ

μ΄λŠ” add, has, removeλ₯Ό 톡해 κ°€λŠ₯ν•©λ‹ˆλ‹€.

const set = new Set();

// μΆ”κ°€
test = set.add(1) // add λ©”μ„œλ“œλŠ” μΆ”κ°€λœ μΈμŠ€ν„΄μŠ€μ˜ 결과값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
console.log(test) // Set(1) {1}

// 검색
set.has(1) // true;

// μ‚­μ œ
const isDeleted = set.remove(1) // μ‹€ν–‰ ν›„ κ²°κ³Ό μƒνƒœλ₯Ό boolean으둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.
console.log(isDeleted) // true

순회

μ΄ν„°λŸ¬λΈ”μ΄λ‹ˆ, for ... of ...κ°€ κ°€λŠ₯ν•˜λ©°, ν‘œμ€‘λ„€ 맞좰 forEach λ©”μ„œλ“œ μ—­μ‹œ κ΅¬ν˜„λ˜μ–΄ μžˆγ……λΈŒλ‹ˆλ‹€.

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

// λ‹€μŒμ€ λ™μΌν•˜κ²Œ 1 2 3 4λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
set.forEach(v => console.log(v))
for (let i of set) {console.log(i)}

Map

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ°μ²΄λŠ” 객체의 ν”„λ‘œνΌν‹° ν‚€κ°€ μˆœμ„œκ°€ 보μž₯λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” ν•œκ³„κ°€ μžˆμ–΄μš”.

  1. μ •μˆ˜ ν”„λ‘œνΌν‹°λŠ” 크기 μˆœμ„œλŒ€λ‘œ,
  2. λ¬Έμžμ—΄ ν”„λ‘œνΌν‹°λŠ” λ“€μ–΄μ˜€λŠ” μˆœμ„œλŒ€λ‘œ μ˜€λ„λ‘ ES6에 ν‘œμ€€μœΌλ‘œ μ •μ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

이에 λŒ€ν•œ 원인을 좔적해보면, μ΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ λ‚΄λΆ€ λ‘œμ§μ—μ„œ κΈ°μΈν•˜κ²Œ λ˜λŠ” κ²ƒμœΌλ‘œ μΆ”μΈ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€! πŸ’‘

const obj = { 10: 1, test: 4, hi: 2, 1: 3 };
console.log(obj) // {1: 3, 10: 1, test: 4, hi: 2}

λ˜ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” μ •μˆ˜ ν”„λ‘œνΌν‹°, ν˜Ήμ€ λ¬Έμžμ—΄λ§Œ ν”„λ‘œνΌν‹° ν‚€λ‘œ 쀄 수 μžˆμ–΄μš”.

μ΄λŸ¬ν•œ ν•œκ³„λ₯Ό Map κ°μ²΄λŠ” μ²˜λ¦¬ν•΄μ€„ 수 μžˆμ–΄μš”.
μ΄λŠ”, μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•¨μ— μžˆμ–΄μ„œ 인덱슀 μˆœμ„œλ₯Ό 보μž₯ν•΄μ€˜μ•Ό ν•˜λŠ”λ°, Map이 μ΄ν„°λŸ¬λΈ”μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
λ˜ν•œ Map은 λ‹€λ₯Έ νƒ€μž…μ˜ 값도 ν”„λ‘œνΌν‹° ν‚€λ‘œ 전달이 κ°€λŠ₯ν•΄μš”.

const map = new Map();
map.set(10, 1)
map.set('test', 4)
map.set('hi', 2)
map.set(1, 3)

console.log(map)
// Map(4) {10 => 1, 'test' => 4, 'hi' => 2, 1 => 3}

순회

Map 객체 μ—­μ‹œ μ΄ν„°λŸ¬λΈ”μ΄λ©°, λ”°λΌμ„œ μƒμ†λ°›λŠ” μΈμŠ€ν„΄μŠ€ μ—­μ‹œ μ΄ν„°λŸ¬λΈ”μž…λ‹ˆλ‹€.
μ΄λ•Œ, 이 심볼 μ΄ν„°λ ˆμ΄ν„°μ˜ name은 entriesμž…λ‹ˆλ‹€.

const map = new Map();

map.set(10, 1)
map.set('test', 4)
map.set('hi', 2)
map.set(1, 3)

console.log([...map]) // [[10, 1], ['test', 4], ['hi', 2], [1, 3]]

// μ΄λŸ¬λΈ”μ€ 기본적으둜 심볼 μ΄ν„°λ ˆμ΄ν„°λ₯Ό κ°–κ³  있고, μ΄λŠ” entries λ©”μ„œλ“œμž„μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
console.log(map[Symbol.iterator].name); // 'entries'

// λ°˜ν™˜λœ μ΄ν„°λ ˆμ΄ν„° 객체λ₯Ό 톡해 배열에 λ‹΄μ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
console.log([...map.entries()]) // [[10, 1], ['test', 4], ['hi', 2], [1, 3]]

λ”°λΌμ„œ for ... of와 forEach λ©”μ„œλ“œλ‘œ μˆœνšŒκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.
λ‹€λ§Œ 차이점이라면 forEachλŠ” κ°’, ν‚€λ‘œ κ°€μ Έμ˜¬ 수 μžˆλ‹€λŠ” μ μž…λ‹ˆλ‹€.

map.forEach((v, key) => console.log(key, v)) 
// 10 1  
// test 4  
// hi 2  
// 1 3

for (let i of map) { console.log(i) }
// [10, 1]
// ['test', 4]
// ['hi', 2]
// [1, 3]

μΆ”κ°€, 검색, μ‚­μ œ

Setκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ set get(has) delete λ©”μ„œλ“œλ₯Ό 톡해 μΆ”κ°€, 검색, μ‚­μ œκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

const map = new Map();
map.set('key', 'value'); // key와 valueλ₯Ό 인수둜 μ „λ‹¬ν•˜μ—¬ μΈμŠ€ν„΄μŠ€μ— 킀와 값을 κ°–λŠ” ν”„λ‘œνΌν‹°λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

// map.get은 μˆœμ „νžˆ 값을 μ–»κΈ° μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©ν•˜λ©°, 
// 킀에 ν•΄λ‹Ήν•˜λŠ” 값이 μ—†λ‹€λ©΄ `undefined`μž…λ‹ˆλ‹€.
map.get('key') // 'value'

// 반면 `has`λŠ” 값을 `boolean`으둜 λ°˜ν™˜ν•˜λ―€λ‘œ, μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό 탐색할 λ•Œ μœ λ¦¬ν•©λ‹ˆλ‹€.
map.has('key') // true

// μ‚­μ œλŠ” κ²°κ³Ό μ—¬λΆ€λ₯Ό boolean으둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.
const deleteResult = map.delete('key')
console.log(deleteResult) // true;

Mapκ³Ό Object의 μ—°μ‚° 속도

μ–΄λ–»κ²Œ 보면 ν˜ΈκΈ°μ‹¬μ΄ μžˆλŠ” 뢀뢄이 이것일 것 κ°™κΈ°λŠ” ν•΄μš”.
λ§Œμ•½ Map이 Object보닀 μ„±λŠ₯이 μ’‹λ‹€λ©΄? μ–΄λŠμˆœκ°„ Objectκ°€ λ ˆκ±°μ‹œκ°€ 될 수 있기 λ•Œλ¬Έμ΄μ£ .

μ‹€μ œλ‘œ λ‘˜μ€ μ„±λŠ₯μƒμ—μ„œ λ―Έλ¬˜ν•œ 차이가 λ°œμƒν•©λ‹ˆλ‹€.

  • 일단 μ „λ°˜μ μœΌλ‘œ κ²°κ³Όκ°€ λΈŒλΌμš°μ € μ—”μ§„λ§ˆλ‹€ λ‹€λ₯΄λ‹€λŠ” 게 ν•¨μ •μž…λ‹ˆλ‹€. (μ €λŠ” Chrome V8을 κΈ°μ€€μœΌλ‘œ ν•˜κ² μŠ΅λ‹ˆλ‹€.)
  • λ§Œμ•½ ν”„λ‘œνΌν‹° μ‚­μ œκ°€ μˆ˜ν–‰λœλ‹€λ©΄, Object보닀 Map이 μ••λ„μ μœΌλ‘œ μœ λ¦¬ν•©λ‹ˆλ‹€.
  • λ§Œμ•½ λ‹¨μˆœν•œ κ°’ 변경이 μˆ˜ν–‰λœλ‹€λ©΄, μ›ν˜•μΈ Objectκ°€ μ’€ 더 μœ λ¦¬ν•©λ‹ˆλ‹€.
  • 값을 κ°€μ Έμ˜€λŠ” 것 μ—­μ‹œ Objectκ°€ μœ λ¦¬ν•©λ‹ˆλ‹€.
  • ν•˜μ§€λ§Œ 값을 처음 λ§Œλ“œλŠ” μž‘μ—…μ€ Map이 μœ λ¦¬ν•©λ‹ˆλ‹€.
  • λ©”λͺ¨λ¦¬μ˜ 경우 Map이 훨씬 더 많이 μž‘μ•„λ¨ΉλŠ”λ‹€.

즉 V8 κΈ°μ€€μœΌλ‘œ μ •λ¦¬ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™λ„€μš”!

  1. 생성과 μ‚­μ œκ°€ λΉˆλ²ˆν•˜λ‹€λ©΄ Map을 κ³ λ €ν•œλ‹€.
  2. λ©”λͺ¨λ¦¬κ°€ μ κ±°λ‚˜, κ°’μ˜ 검색과 λ³€κ²½λ§Œ 자주 μΌμ–΄λ‚œλ‹€λ©΄ Objectλ₯Ό κ³ λ €ν•œλ‹€.

μΆ”κ°€: Map의 ν•œκ³„

μΆ”κ°€λ‘œ, Map은 JSON을 μ§€μ›ν•˜μ§€ μ•Šμ•„μš”. 😭
λ”°λΌμ„œ λ­”κ°€ 데이터λ₯Ό APIλ₯Ό 톡해 주고받을 λ•Œμ—λŠ”, μ‚¬μš©μ„ λ‹€μ‹œ κ²€ν† ν•΄λ³΄μ‹œλŠ” 것을 μΆ”μ²œν•©λ‹ˆλ‹€!

πŸŽ‰ 마치며

사싀 이게 λ‹€μ—μš”.
κ²°κ΅­ 빌트인 κ°μ²΄λΌλŠ” 건 μš©λ²•λ§Œ νŒŒμ•…ν•˜λ©΄ 끝이긴 ν•œλ°, λ­”κ°€ μ•„μ‰¬μ›Œμ„œ μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš°λ₯Ό 더 μ°Ύμ•„λ³΄κ²Œ λλ„€μš”.

κ·Έλž˜λ„ μ—°μ‚° 속도λ₯Ό 더 깊게 이해할 수 μžˆμ–΄μ„œ κΈ°λΆ„ 쒋은 κ³΅λΆ€μ˜€μŠ΅λ‹ˆλ‹€.

그럼, λ‹€λ“€ 즐거운 κ³΅λΆ€ν•˜μ‹œκΈ°λ₯Ό 바라며. 이상! 🌈

πŸ“ 참고자료

stackoverflow - Map vs Object in JavaScript

profile
People are scared of falling to the bottom but born from there. What they've lost is nth. πŸ˜‰
post-custom-banner

0개의 λŒ“κΈ€