Array vs Set vs Map πŸ₯Š

limhiΒ·2023λ…„ 10μ›” 21일
post-thumbnail

κ΄€λ¦¬μž νŽ˜μ΄μ§€μ—μ„œ λ©”λ‰΄μ˜ κΆŒν•œμ„ κ΄€λ¦¬ν•˜λŠ” κΈ°λŠ₯을 개발 쀑, κΆŒν•œμ„ state λ³€μˆ˜μ— μ–΄λ–€ ꡬ쑰둜 담을 것인가 에 λŒ€ν•œ 고민을 ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

메뉴λͺ…을 key 둜 두고 읽기, μ“°κΈ° λ“±μ˜ κΆŒν•œμ„ 배열에 λ‹΄μ•„μ„œ value둜 λ„£μœΌλ©΄ 될까..? 그런데 쀑볡값이 λ“€μ–΄κ°€λ©΄ μ–΄λ–‘ν•˜μ§€?

κ·Έλ ‡κ²Œ μžμ—°μŠ€λŸ½κ²Œ κ°€μž₯ 많이 μ‚¬μš©ν•˜λ˜ Array 와 μ‘°κΈˆμ€ λ‚―μ„€μ—ˆλ˜ Set, 그리고 Map 에 λŒ€ν•΄ κ³΅λΆ€ν•˜κ²Œ λ˜μ—ˆλ”λžλ‹ˆλ‹€... μ…‹μ˜ 데이터 ꡬ쑰λ₯Ό μ•Œμ•„λ³΄μžκ΅¬μš” πŸ‘‡πŸ‘‡

Array πŸš‚

μš°μ„ , ArrayλŠ” JavaScriptμ—μ„œ κ°€μž₯ 기본적으둜 μ‚¬μš©λ˜λŠ” 데이터 κ΅¬μ‘°μž…λ‹ˆλ‹€. μˆœμ„œλŒ€λ‘œ μ €μž₯되며 각 ν•­λͺ©μ€ κ³ μœ ν•œ 인덱슀λ₯Ό κ°€μ§‘λ‹ˆλ‹€. λ°°μ—΄μ˜ μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘ν•˜λ©°, 0, 1, 2, 3, ...κ³Ό 같이 순차적으둜 μ¦κ°€ν•©λ‹ˆλ‹€. λ”°λΌμ„œ 인덱슀λ₯Ό 톡해 값에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

νŠΉμ • key κ°€ μ—†λŠ” 값을 순차적으둜 넣을 λ•Œ 많이 μ“°κ³€ ν•˜λŠ”λ°μš”. μˆœμ„œκ°€ μžˆμ–΄ 인덱슀둜 접근이 κ°€λŠ₯ν•˜λ‹€λŠ” 점이 μž₯μ μ΄μ§€λ§Œ 쀑볡값을 ν—ˆμš©ν•˜κΈ° λ•Œλ¬Έμ— λ™μΌν•œ 값이 μ—¬λŸ¬λ²ˆ λ“€μ–΄κ°ˆ 수 μžˆλ‹€λŠ” 것이 λ‹¨μ μž…λ‹ˆλ‹€.

πŸ’‘ Set

Set은 ES6λΆ€ν„° μ§€μ›λ˜κΈ° μ‹œμž‘ν•œ κ³ μœ ν•œ κ°’λ§Œμ„ μ €μž₯ν•  수 μžˆλŠ” 데이터 ꡬ쑰둜, μ€‘λ³΅λœ 값을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
μˆœμ„œκ°€ μžˆμ§€λ§Œ 인덱슀둜 μ ‘κ·Όν•  수 μ—†μœΌλ©°, λŒ€μ‹  κ°’ 자체둜 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ€‘λ³΅λœ 값을 ν—ˆμš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μœ λ‹ˆν¬ν•œ κ°’λ§Œ 관리할 λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©λ˜μ§€λ§Œ 인덱슀둜 μ ‘κ·Όν•  수 μ—†κΈ° λ•Œλ¬Έμ— μˆœνšŒν•˜κΈ° μœ„ν•΄μ„œλŠ” 반볡자(iterator) λ‚˜ for문을 ν™œμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Map πŸ—ΊοΈ

Map도 ES6λΆ€ν„° λ„μž…λœ 데이터 ꡬ쑰둜, key-value 의 μŒμ„ μ €μž₯ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. Map은 key의 μˆœμ„œλ₯Ό κΈ°μ–΅ν•˜λ©° 각 key κ°€ κ³ μœ ν•˜λ―€λ‘œ 이의 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

Object와 λΉ„μŠ·ν•΄ 보일 수 μžˆμ§€λ§Œ μ€‘μš”ν•œ 차이점이 μžˆμŠ΅λ‹ˆλ‹€. ObjectλŠ” ν‚€λ‘œ λ¬Έμžμ—΄λ§Œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, Map은 μ–΄λ– ν•œ 데이터 νƒ€μž…λ„ ν‚€λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ©”μ†Œλ“œ 비ꡐ 🧐

κ·Έλ ‡λ‹€λ©΄, 각 λ©”μ†Œλ“œλŠ” μ–΄λ–¨κΉŒμš”?
Array, Set 그리고 Map 의 μ£Όμš” λ©”μ†Œλ“œλ“€μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μš”μ†Œ μΆ”κ°€

const myArray = [1, 2, 3];
myArray.push(4); // λ°°μ—΄ 끝에 μš”μ†Œ μΆ”κ°€
myArray.unshift(0); // λ°°μ—΄ μ‹œμž‘μ— μš”μ†Œ μΆ”κ°€

const mySet = new Set();
mySet.add(1); // μš”μ†Œ μΆ”κ°€
mySet.add(2);

const myMap = new Map();
myMap.set('key1', 'value1'); // ν‚€-κ°’ 쌍 μΆ”κ°€
myMap.set('key2', 'value2');

μš”μ†Œ μ‚­μ œ

const myArray = [1, 2, 3, 4];
myArray.pop(); // λ°°μ—΄ 끝의 μš”μ†Œ 제거
myArray.shift(); // λ°°μ—΄ μ‹œμž‘μ˜ μš”μ†Œ 제거

const mySet = new Set();
mySet.add(1);
mySet.delete(1); // μš”μ†Œ 제거

const myMap = new Map();
myMap.set('key1', 'value1');
myMap.delete('key1'); // ν‚€-κ°’ 쌍 제거

Array 와 Set 의 속도 비ꡐ πŸ›Ό

그럼, 쀑볡값이 ν—ˆμš©λ˜μ§€ μ•ŠλŠ” Set 이 더 μ’‹κ² λ„€? 라고 μƒκ°ν•˜λ˜ 쀑, μ•„λž˜μ˜ 글을 λ°œκ²¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€!

JavaScript Set vs. Array performance

μœ„ 글은 Array 와 Set 의 비ꡐλ₯Ό 검색해보신 뢄듀이라면 ν•œ λ²ˆμ”©μ€ κΌ­ 봀을 λ²•ν•œ stack overflow 의 κΈ€μΈλ°μš”, μš”μ•½ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€!

  • μš”μ†Œλ₯Ό μΆ”κ°€, λ³€κ²½ν•˜λŠ” ν•¨μˆ˜λŠ” array κ°€ λΉ λ₯΄λ‹€.
  • μš”μ†Œλ₯Ό μ‚­μ œν•˜λŠ” λΆ€λ¬Έμ—μ„œλŠ” Set 의 압도적인 승리.

Array 의 λ©”μ†Œλ“œ 속도가 더 λΉ λ₯΄λ‹€λŠ” ν₯미둜운 μ‹€ν—˜ κ²°κ³Ό μ˜€λŠ”λ°μš”..

κ·Έλž˜μ„œ, μ–΄λ–€ 데이터 ꡬ쑰둜 κ΅¬ν˜„ν•¨?

메뉴λͺ…을 key 둜, κΆŒν•œμ„ value 둜 λ‹΄λŠ” κ΅¬μ‘°λŠ” Map κ³Ό 같은 νƒ€μž…μ„ μ‚¬μš©ν•¨μ— 변함이 μ—†μ—ˆμ§€λ§Œ 각 κΆŒν•œμ„ array 둜 λ‹΄μ„κΉŒ set 으둜 λ‹΄μ„κΉŒ 에 λŒ€ν•΄ κ³ λ―Όν•˜μ˜€λŠ”λ°μš” πŸ€”
Array 의 λ©”μ†Œλ“œ 속도이냐, Set 의 쀑볡값을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” νŠΉμ§•μ΄λƒμ— κ³ λ―Όν•˜λ˜ 쀑, κ²°κ΅­ Set 으둜 κ²°μ •ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  1. λ§Žμ€ 값이 λ“€μ–΄κ°€λŠ” λ³€μˆ˜κ°€ μ•„λ‹ˆκΈ°μ— 속도에 λŒ€ν•΄ μš°μ„ μˆœμœ„λ₯Ό κ°€μ§€μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€!
  2. λ˜ν•œ, Set이 쀑볡이 ν—ˆμš©λ˜μ§€ μ•ŠλŠ” 데이터 ꡬ쑰이닀 λ³΄λ‹ˆ, for문을 μ‚¬μš©ν•˜μ—¬ μš”μ†Œλ₯Ό μ‚­μ œν•΄μ•Ό ν•˜λŠ” array 와 달리 μš”μ†Œλ₯Ό μ‚­μ œν•˜λŠ” λ©”μ†Œλ“œκ°€ ꡉμž₯히 μ§κ΄€μ μ΄μ–΄μ„œ μ½”λ“œμ˜ 가독성이 더 μ’‹λ”λΌκ΅¬μš”.

마무리

이번 기회λ₯Ό 톡해 μƒˆλ‘­κ²Œ Set 에 λŒ€ν•΄ μ•Œκ²Œ λ˜μ–΄ 맀우 ν₯λ―Έλ‘œμ› μŠ΅λ‹ˆλ‹€!
μ•žμœΌλ‘œλŠ” 쀑볡값을 ν—ˆμš©ν•˜μ§€ μ•Šκ³  속도에 영ν–₯을 λΌμΉ˜μ§€ μ•ŠλŠ” μ •λ„μ˜ 값을 μ €μž₯ν•  λ•Œ, 데이터 ꡬ쑰둜 Set 을 λ¨Όμ € λ– μ˜¬λ¦΄ 수 μžˆμ„ 것 κ°™λ„€μš”! (μ•„λŠ” 만큼 λ³΄μ΄λŠ” 법..!)

더 λ§Žμ€ 데이터 ꡬ쑰λ₯Ό μ•Œμ•„λ‘λ©΄ λ‹€μ–‘ν•œ 문제 ν•΄κ²° 방법을 λ– μ˜¬λ¦΄ 수 μžˆμ„ 것 κ°™μ•„ μ˜μš•μ΄ μƒ˜μ†ŸμŠ΅λ‹ˆλ‹€ 😀
그럼 μ˜€λŠ˜λ„ ν–‰μ½” ⭐️

profile
null μ‚¬λž‘ν•˜μ§€ μ•Šμ•„ - μ–΄λ°˜μžμΉ΄νŒŒ

0개의 λŒ“κΈ€