사전(Dictionary) 클래스란?
사전(Dictionary), 또는 맵(Map)은 데이터를 키(Key)-값(Value) 쌍의 형태로 저장하는 대표적인 자료구조입니다. 배열과 달리 인덱스가 아닌 고유한 키를 통해 값에 바로 접근할 수 있어, 검색·삽입·삭제 작업을 효율적으로 처리할 수 있습니다.
자바스크립트는 ES6부터 내장 Map 객체를 제공하지만, 이를 직접 구현해 보면 해시 기반 자료구조의 동작 원리를 깊이 있게 이해할 수 있습니다. 아래는 일반 객체({})를 내부 저장소로 활용해 사전 자료구조를 구현한 MyMap 클래스입니다.
MyMap 클래스 전체 구현
다음은 MyMap 클래스의 완성된 구현 코드입니다.
class MyMap {
constructor() {
this.container = {};
}
display() {
console.log(this.container);
}
hasKey(key) {
return key in this.container;
}
put(key, value) {
this.container[key] = value;
}
delete(key) {
if (this.hasKey(key)) {
delete this.container[key];
return true;
}
return false;
}
get(key) {
return this.hasKey(key) ? this.container[key] : undefined;
}
keys() {
return Object.keys(this.container);
}
values() {
let values = [];
for (let key in this.container) {
values.push(this.container[key]);
}
return values;
}
clear() {
this.container = {};
}
forEach(callback) {
for (let prop in this.container) {
// 콜백 호출 형식: callback(key, value)
callback(prop, this.container[prop]);
}
}
}주요 메서드 살펴보기
1. 생성자(constructor)
인스턴스가 생성될 때 빈 객체를 컨테이너로 초기화하여, 모든 키-값 쌍이 여기에 저장됩니다.
2. put(key, value)
지정한 키에 값을 저장합니다. 이미 존재하는 키라면 기존 값이 새 값으로 덮어씌워집니다.
3. hasKey(key) / get(key)
hasKey는 in 연산자를 사용해 해당 키의 존재 여부를 확인하고, get은 키가 있으면 값을 반환하고 없으면 undefined를 안전하게 반환합니다.
4. delete(key)
키가 존재할 경우 해당 항목을 삭제하고 true를, 존재하지 않으면 false를 반환해 삭제 성공 여부를 명확히 알려줍니다.
5. keys() / values()
keys()는 Object.keys()로 모든 키의 배열을, values()는 for...in 반복문으로 모든 값의 배열을 각각 반환합니다.
6. clear() / forEach(callback)
clear()는 저장소를 새 객체로 교체해 전체 데이터를 한 번에 비우고, forEach()는 저장된 모든 항목을 순회하며 (key, value) 형태로 콜백 함수를 실행합니다.
사용 예시
const map = new MyMap();
map.put("name", "홍길동");
map.put("age", 25);
console.log(map.hasKey("name")); // true
console.log(map.get("name")); // "홍길동"
map.delete("age"); // true
map.forEach((key, value) => console.log(key, value));
// name 홍길동
map.clear(); // 전체 비우기마무리
이처럼 MyMap 클래스는 내장 Map 객체의 핵심 동작을 단순한 객체 조작만으로 재현한 것입니다. 다만 실무에서는 키가 문자열·심볼로 제한되고 프로토타입 체인의 영향을 받을 수 있다는 점을 고려해야 하므로, 일반적인 개발에서는 내장 Map을 사용하고, 학습 목적이나 커스텀 로직이 필요한 경우에 직접 구현한 클래스를 활용하는 것이 좋습니다.