logo

DowanKim

32. Map, Set

2026λ…„ 4μ›” 14일

μžλ°”μŠ€ν¬λ¦½νŠΈ

πŸ—ΊοΈ 1. λ§΅ (Map): ν‚€κ°€ μžˆλŠ” λ°μ΄ν„°μ˜ μ—…κ·Έλ ˆμ΄λ“œ

맡은 객체와 λΉ„μŠ·ν•˜κ²Œ 'ν‚€-κ°’' μŒμ„ μ €μž₯ν•˜μ§€λ§Œ, 훨씬 더 μœ μ—°ν•˜κ³  κ°•λ ₯ν•©λ‹ˆλ‹€.

🌟 핡심 차이점

  • 자유둜운 ν‚€: κ°μ²΄λŠ” ν‚€λ‘œ 였직 λ¬Έμžμ—΄κ³Ό μ‹¬λ³Όλ§Œ ν—ˆμš©ν•˜μ§€λ§Œ, 맡은 객체, 숫자, 뢈린 λ“± μ–΄λ–€ μžλ£Œν˜•λ„ ν‚€λ‘œ μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μˆœμ„œ 보μž₯: 값이 μ‚½μž…λœ μˆœμ„œλ₯Ό κΈ°μ–΅ν•©λ‹ˆλ‹€.
  • size ν”„λ‘œνΌν‹°: 내뢀에 μš”μ†Œκ°€ λͺ‡ κ°œμΈμ§€ ν•œ λ²ˆμ— μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ› οΈ μ£Όμš” λ©”μ„œλ“œ

  • map.set(key, value): 데이터λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. (λ©”μ„œλ“œ 체이닝 κ°€λŠ₯)
  • map.get(key): 값을 μ½μ–΄μ˜΅λ‹ˆλ‹€.
  • map.has(key): ν‚€μ˜ 쑴재 μ—¬λΆ€λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.
  • map.size: μš”μ†Œμ˜ 총 개수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

✨ 2. μ…‹ (Set): 쀑볡 μ—†λŠ” κ³ μœ ν•œ κ°’μ˜ μ§‘ν•©

셋은 였직 **κ°’(value)**만 μ €μž₯ν•˜λ©°, 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” νŠΉλ³„ν•œ μ»¬λ ‰μ…˜μž…λ‹ˆλ‹€.

🌟 핡심 νŠΉμ§•

  • μœ μΌλ¬΄μ΄μ„±: λ™μΌν•œ 값을 μ—¬λŸ¬ 번 add 해도 ν•œ 번만 μ €μž₯λ©λ‹ˆλ‹€.
  • μ„±λŠ₯ μ΅œμ ν™”: νŠΉμ • 값이 μžˆλŠ”μ§€ 확인(has)ν•  λ•Œ λ°°μ—΄μ˜ find보닀 훨씬 λΉ λ¦…λ‹ˆλ‹€.
  • μš©λ„: 방문자 λͺ©λ‘ 관리, 쀑볡 데이터 제거 λ“±.

πŸ”„ 3. 객체 ↔️ λ§΅ λ³€ν™˜ κ°€μ΄λ“œ

κΈ°μ‘΄ 객체 기반 μ½”λ“œμ™€ 맡을 ν•¨κ»˜ 써야 ν•  λ•Œ μœ μš©ν•œ λ©”μ„œλ“œλ“€μž…λ‹ˆλ‹€.

λ³€ν™˜ λ°©ν–₯λ©”μ„œλ“œμ„€λͺ…
객체 β†’ λ§΅Object.entries(obj)객체λ₯Ό [ν‚€, κ°’] 쌍의 λ°°μ—΄λ‘œ λ°”κΎΈμ–΄ λ§΅ μƒμ„±μžμ— μ „λ‹¬ν•©λ‹ˆλ‹€.
λ§΅ β†’ 객체Object.fromEntries(map)맡의 데이터λ₯Ό ν‰λ²”ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ 객체둜 λ‹€μ‹œ λ³€ν™˜ν•©λ‹ˆλ‹€.

πŸŽ™οΈ 기술 λ©΄μ ‘ λŒ€λΉ„ (Interview Questions)

Q1. 일반 객체 λŒ€μ‹  Map을 μ‚¬μš©ν•˜λŠ” 것이 μœ λ¦¬ν•œ κ²½μš°λŠ” μ–Έμ œμΈκ°€μš”? (쀑급)

λ‹΅λ³€: 첫째, ν‚€μ˜ νƒ€μž…μ΄ λ‹€μ–‘ν•΄μ•Ό ν•  λ•Œμž…λ‹ˆλ‹€. 객체λ₯Ό ν‚€λ‘œ μ¨μ„œ 데이터λ₯Ό λ§€ν•‘ν•΄μ•Ό ν•œλ‹€λ©΄ 맡이 μœ μΌν•œ λŒ€μ•ˆμž…λ‹ˆλ‹€. λ‘˜μ§Έ, λ°μ΄ν„°μ˜ μ‚½μž… μˆœμ„œκ°€ μ€‘μš”ν•  λ•Œμž…λ‹ˆλ‹€. μ…‹μ§Έ, λ°μ΄ν„°μ˜ μΆ”κ°€/μ‚­μ œκ°€ λΉˆλ²ˆν•  λ•Œμž…λ‹ˆλ‹€. 맡은 μ΄λŸ¬ν•œ μž‘μ—…μ— μ΅œμ ν™”λ˜μ–΄ μžˆμ–΄ 일반 객체보닀 λ‚˜μ€ μ„±λŠ₯을 λ³΄μ—¬μ€λ‹ˆλ‹€.

Q2. λ°°μ—΄μ—μ„œ 쀑볡을 μ œκ±°ν•˜λŠ” κ°€μž₯ 효율적인 방법은 λ¬΄μ—‡μΈκ°€μš”? (기초)

λ‹΅λ³€: **Set**을 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. new Set(array)λ₯Ό 톡해 쀑볡이 제거된 μ΄ν„°λŸ¬λΈ”μ„ λ§Œλ“€κ³ , λ‹€μ‹œ Array.from()μ΄λ‚˜ μ „κ°œ μ—°μ‚°μž([...])λ₯Ό μ‚¬μš©ν•΄ λ°°μ—΄λ‘œ λ³€ν™˜ν•˜λ©΄ λ©λ‹ˆλ‹€. 이 방식은 $O(n)$의 μ‹œκ°„ λ³΅μž‘λ„λ‘œ 맀우 νš¨μœ¨μ μž…λ‹ˆλ‹€.

Q3. Mapμ—μ„œ map.keys()κ°€ λ°˜ν™˜ν•˜λŠ” 값은 무엇이며, λ°°μ—΄ λ©”μ„œλ“œλ₯Ό λ°”λ‘œ μ“Έ 수 μ—†λŠ” μ΄μœ λŠ”? (심화)

λ‹΅λ³€: map.keys()λŠ” 'μ΄ν„°λŸ¬λΈ”(Iterable)' 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. μ΄λŠ” 배열이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— pushλ‚˜ pop 같은 λ°°μ—΄ μ „μš© λ©”μ„œλ“œκ°€ μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ°°μ—΄λ‘œ μ‚¬μš©ν•˜λ €λ©΄ Array.from(map.keys())λ₯Ό 거쳐 μ§„μ§œ λ°°μ—΄λ‘œ λ³€ν™˜ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.


πŸ’‘ κΈ°μ–΅ν•΄μ•Ό ν•  μ€‘μš”ν•œ λ‚΄μš©

  1. λ§΅(Map)은 ν‚€λ₯Ό 비ꡐ할 λ•Œ SameValueZero μ•Œκ³ λ¦¬μ¦˜μ„ μ”λ‹ˆλ‹€. μ΄λŠ” NaN === NaN을 true둜 κ°„μ£Όν•˜λ―€λ‘œ, NaN도 맡의 ν‚€λ‘œ μ•ˆμ „ν•˜κ²Œ μ“Έ 수 μžˆλ‹€λŠ” λœ»μž…λ‹ˆλ‹€.
  2. μ…‹(Set)의 forEachλŠ” μΈμžκ°€ 3κ°œμž…λ‹ˆλ‹€. (value, valueAgain, set) μ΄λŠ” 맡과의 μΈν„°νŽ˜μ΄μŠ€ ν˜Έν™˜μ„±μ„ μœ„ν•΄ μ„€κ³„λœ κ΅¬μ‘°μ΄λ‹ˆ λ‹Ήν™©ν•˜μ§€ λ§ˆμ„Έμš”!

μ• λ„ˆκ·Έλž¨(Anagram) 문제처럼 λ³΅μž‘ν•œ λ¬Έμžμ—΄ 쑰합을 λ‹€λ£° λ•Œ 맡을 ν™œμš©ν•˜λ©΄ μ½”λ“œκ°€ 훨씬 κ°„κ²°ν•΄μ§‘λ‹ˆλ‹€.

μš”μ•½

맡은 ν‚€κ°€ μžˆλŠ” 값이 μ €μž₯된 μ»¬λ ‰μ…˜μž…λ‹ˆλ‹€.

μ£Όμš” λ©”μ„œλ“œμ™€ ν”„λ‘œνΌν‹°:

  • new Map([iterable]) – 맡을 λ§Œλ“­λ‹ˆλ‹€.Β [key,value]쌍이 μžˆλŠ”Β iterable(예: λ°°μ—΄)을 μ„ νƒμ μœΌλ‘œ λ„˜κΈΈ 수 μžˆλŠ”λ°, μ΄λ•Œ λ„˜κΈ΄ μ΄ν„°λŸ¬λΈ” κ°μ²΄λŠ” λ§΅ μ΄ˆκΈ°ν™”μ— μ‚¬μš©λ©λ‹ˆλ‹€.
  • map.set(key, value) – ν‚€λ₯Ό μ΄μš©ν•΄ 값을 μ €μž₯ν•©λ‹ˆλ‹€.
  • map.get(key) – 킀에 ν•΄λ‹Ήν•˜λŠ” 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.Β keyκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄Β undefinedλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • map.has(key) – ν‚€κ°€ 있으면 true, μ—†μœΌλ©΄Β falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • map.delete(key) – 킀에 ν•΄λ‹Ήν•˜λŠ” 값을 μ‚­μ œν•©λ‹ˆλ‹€.
  • map.clear() – λ§΅ μ•ˆμ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.
  • map.size – μš”μ†Œμ˜ 개수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

μΌλ°˜μ μΈΒ κ°μ²΄μ™€μ˜ 차이점:

  • ν‚€μ˜ νƒ€μž…μ— μ œμ•½μ΄ μ—†μŠ΅λ‹ˆλ‹€. 객체도 ν‚€κ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • sizeΒ ν”„λ‘œνΌν‹° λ“±μ˜ μœ μš©ν•œ λ©”μ„œλ“œλ‚˜ ν”„λ‘œνΌν‹°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

셋은 쀑볡이 μ—†λŠ” 값을 μ €μž₯ν•  λ•Œ μ“°μ΄λŠ” μ»¬λ ‰μ…˜μž…λ‹ˆλ‹€.

μ£Όμš” λ©”μ„œλ“œμ™€ ν”„λ‘œνΌν‹°:

  • new Set([iterable]) – 셋을 λ§Œλ“­λ‹ˆλ‹€.Β iterable 객체λ₯Ό μ„ νƒμ μœΌλ‘œ 전달받을 수 μžˆλŠ”λ°(λŒ€κ°œ 배열을 μ „λ‹¬λ°›μŒ), μ΄ν„°λŸ¬λΈ” 객체 μ•ˆμ˜ μš”μ†ŒλŠ” 셋을 μ΄ˆκΈ°ν™”ν•˜λŠ”λ° μ“°μž…λ‹ˆλ‹€.
  • set.add(value) – 값을 μΆ”κ°€ν•˜κ³  μ…‹ μžμ‹ μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€. μ…‹ 내에 이미 valueκ°€ μžˆλŠ” 경우 μ•„λ¬΄λŸ° μž‘μ—…μ„ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • set.delete(value) – 값을 μ œκ±°ν•©λ‹ˆλ‹€. 호좜 μ‹œμ μ— μ…‹ 내에 값이 μžˆμ–΄μ„œ μ œκ±°μ— μ„±κ³΅ν•˜λ©΄Β true, μ•„λ‹ˆλ©΄Β falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • set.has(value) – μ…‹ 내에 값이 μ‘΄μž¬ν•˜λ©΄Β true, μ•„λ‹ˆλ©΄Β falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • set.clear() – 셋을 λΉ„μ›λ‹ˆλ‹€.
  • set.size – 셋에 λͺ‡ 개의 값이 μžˆλŠ”μ§€ μ„Έμ€λ‹ˆλ‹€.

맡과 셋에 반볡 μž‘μ—…μ„ ν•  땐, ν•΄λ‹Ή μ»¬λ ‰μ…˜μ— μš”μ†Œλ‚˜ 값을 μΆ”κ°€ν•œ μˆœμ„œλŒ€λ‘œ 반볡 μž‘μ—…μ΄ μˆ˜ν–‰λ©λ‹ˆλ‹€. λ”°λΌμ„œ 이 두 μ»¬λ ‰μ…˜μ€ 정렬이 λ˜μ–΄μžˆμ§€ μ•Šλ‹€κ³  ν•  수 μ—†μŠ΅λ‹ˆλ‹€. κ·Έλ ‡μ§€λ§Œ μ»¬λ ‰μ…˜ λ‚΄ μš”μ†Œλ‚˜ 값을 재 μ •λ ¬ν•˜κ±°λ‚˜ (λ°°μ—΄μ—μ„œ 인덱슀λ₯Ό μ΄μš©ν•΄ μš”μ†Œλ₯Ό κ°€μ Έμ˜€λŠ” κ²ƒμ²˜λŸΌ) 숫자λ₯Ό μ΄μš©ν•΄ νŠΉμ • μš”μ†Œλ‚˜ 값을 κ°€μ§€κ³  μ˜€λŠ” 것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.