뭘 쓸지 고민될 때가 있죠
프로젝트를 하다 보면 데이터를 담을 때 Map을 쓸까 Set을 쓸까 고민될 때가 있어요. 기능적으로는 둘 다 잘 작동하는데, 성능이나 메모리 측면에서는 어떤 차이가 있는지 궁금하더라고요. 그래서 오늘은 Map과 Set의 메모리 사용량을 비교해볼까 합니다.
기본부터 짚고 넘어가기
Set은 중복 없는 값들의 집합이고, Map은 키-값 쌍을 저장하는 구조입니다. 이 차이가 메모리 사용에도 그대로 반영돼요.
Set에 숫자 3개를 담는다면?
const mySet = new Set([1, 2, 3]);
딱 세 개의 값만 메모리에 저장됩니다.
반면 Map에 같은 데이터를 담으려면?
const myMap = new Map([
["a", 1],
["b", 2],
["c", 3],
]);
키인 'a', 'b', 'c'와 값인 1, 2, 3을 모두 저장해야 해요. 단순 계산으로도 두 배의 데이터가 필요하다는 걸 알 수 있죠.
실제로 얼마나 차이날까?
단순 데이터 저장할 때
같은 개수의 데이터를 저장한다고 가정해볼게요.
// Set - 값만 저장
const numberSet = new Set([1, 2, 3, 4, 5]);
// Map - 키와 값 모두 저장
const numberMap = new Map([
[1, "one"],
[2, "two"],
[3, "three"],
[4, "four"],
[5, "five"],
]);
Map은 Set이 저장하는 값에 더해 키까지 저장하니까, 단순히 생각해도 거의 두 배 가까운 메모리를 쓰게 됩니다. 키와 값의 타입에 따라 조금씩 다르겠지만, 기본적으로 두 종류의 데이터를 보관해야 하는 건 맞으니까요.
복잡한 객체를 다룰 때
객체나 배열 같은 복잡한 자료형을 저장하면 이야기가 좀 달라져요.
// Set에 객체 저장
const objectSet = new Set([
{ id: 1, name: "Alice" },
{ id: 2, name: "Bob" },
]);
// Map에 객체 저장
const objectMap = new Map([
[{ id: 1 }, { name: "Alice" }],
[{ id: 2 }, { name: "Bob" }],
]);
이 경우 Map은 키로 쓰이는 객체와 값으로 쓰이는 객체를 모두 메모리에 올려야 합니다. 게다가 자바스크립트 엔진은 내부적으로 키와 값을 연결하기 위한 추가 구조도 필요하고요. 이런 오버헤드까지 고려하면 메모리 차이는 더 벌어질 수 있어요.
그래서 뭘 써야 할까?
간단하게 정리하면 이렇습니다.
| 특징 | Map | Set |
|---|---|---|
| 저장 형식 | 키-값 쌍 | 값만 |
| 메모리 사용 | 더 많음 (키 + 값) | 더 적음 (값만) |
| 주요 용도 | 데이터 조회, 관리 | 중복 제거, 고유값 저장 |
결국 메모리 효율만 놓고 보면 Set이 유리합니다. 만약 키-값 매핑이 필요 없고 단순히 중복 없는 값들만 관리하면 된다면 Set을 쓰는 게 낫죠.
하지만 실무에서는 메모리만 보고 결정하진 않잖아요? 빠른 조회가 필요하거나 데이터를 키로 관리해야 한다면 당연히 Map을 써야 하고요. 중요한 건 각 자료구조의 특성을 이해하고 상황에 맞게 선택하는 거라고 생각합니다.
다음에는 실제 벤치마크 테스트 결과도 한번 공유해볼게요 😊