이제 해시 테이블의 각 메서드를 정의하는 데 사용할 간단한 클래스를 만들어 보겠습니다. 해시 테이블 데이터를 담을 컨테이너 객체를 생성하고, 테이블의 내용을 출력하는 display 함수도 함께 작성합니다. 충돌(collision) 해결 방식으로는 체이닝(chaining) 기법을 사용합니다.
display 함수는 테이블의 각 엔트리(해시된 값)를 순회하며, 해당 위치에 연결된 모든 키-값 쌍을 출력하는 역할을 합니다.
예제
키-값 쌍을 저장하기 위해 프로토타입에 새로운 클래스(KVPair)도 추가합니다.
class HashTable {
constructor() {
this.container = [];
// 충돌 발생 시 더 많은 요소를 추가할 수 있도록
// 빈 배열로 컨테이너를 초기화합니다
for(let i=0; i < 11; i ++ ) {
this.container.push([]);
}
display() {
this.container.forEach((value, index) => {
let chain = value
.map(({ key, value }) => `{ ${key}: ${value} }`)
.join(" --> ");
console.log(`${index}: ${chain}`);
});
}
hash(key) {
return key % 11;
}
}
HashTable.prototype.KVPair = class {
constructor(key, value) {
this.key = key;
this.value = value;
}
}
}핵심 개념 정리
- 해시 함수(hash): 키를 배열의 인덱스로 변환하는 역할을 합니다. 위 예제에서는
key % 11을 사용하여 0부터 10 사이의 인덱스 값을 얻습니다. - 체이닝(chaining): 서로 다른 키가 같은 인덱스로 해시되는 충돌이 발생했을 때, 해당 인덱스의 배열에 여러 개의 키-값 쌍을 연결 형태로 저장하는 방식입니다. 덕분에 하나의 버킷에 여러 데이터를 안전하게 보관할 수 있습니다.
display 메서드에서는 구조 분해 할당(destructuring)과 같은 자바스크립트의 고급 문법을 활용했습니다. 이를 통해 객체에서 key와 value를 꺼내는 반복적인 코드(boilerplate)를 줄이고, 훨씬 간결하고 가독성 높은 코드를 작성할 수 있습니다.