코테 문제를 풀다보면 자주 나오는 것이 해쉬
이다.
해쉬란 무엇이며, 이를 JS에선 어떻게 적용할 수 있을지 간단하게 알아보려 한다.
해시를 알기 전에 해시 테이블
에 대해 먼저 알아보자.
이는 자료구조 종류 중 하나로 key 와 value를 가진다. 아래와 같은 자료구조를 말한다.
직업: 개발자
나이: 23
전화번호: 010-xxxx-xxxx
이메일: xxxx@naver.com
이렇게 직업, 나이 같은 key
라는 값에 개발자, 23 같은 value를 저장해두는 방식이다.
원래 이러한 것과 비슷한 것이 우리가 자주 쓰는 배열에서도 쓰인다.
대신에 배열과 차이점이라고 한다면 key 값이 배열은 숫자만 가능하다는 점이다.
그렇다면 해시 테이블은? 숫자 뿐 아니라, 문자열도 key 값으로 가능하다.
해시는 해쉬함수
라고 하는 함수를 이용해서 입력값을 고정길이 문자열로 치환하는 것을 말한다.
말이 너무 어렵다. 쉽게 설명해보자.
이전에 배열은 key 값을 숫자만 받을 수 있다고 했다. 그에 비해 해시는 문자열까지 받을 수 있다고 했다. 어떻게 이것이 가능할까?
-> 바로 문자열로 받은 key 값을 해싱이라는 과정을 통해서, 일정 길이의 주소값으로 바꿔서 저장해두고 있기 때문입니다. 이걸 가능하게끔 하는 역할이 해시 함수
의 역할입니다.
한번 해쉬 함수의 예시 코드를 봐보자. (밤의 공간 블로그 코드 참고)
hash(key){
let id = 0;
for(let i = 0;i<key.length;i++){
id += key.charCodeAt(1) * 100;
}
return id % this.size;
}
아래 코드를 보면 key를 받아서 새로운 id 값의 주소를 return 해준다. 이렇게 해주기 때문에 배열처럼 문자열을 key 값으로 하여 저장할 수 있는 것이다.
이러한 과정이 해시
이다. 또한 이를 통해 key, value로 자료구조를 만든것이 해시 테이블
이 되는 것이다.
사실, JS에선 일반 배열에서 key 값에 문자열이 주는게 가능하다.....
아래 코드를 봐보자.
const hashArr = [];
hashArr["나이"] = 23;
hashArr["직업"] = "개발자";
console.log(hashArr["나이"]);
console.log(hashArr);
이렇게 배열에 프로퍼티(key)값으로 문자열을 주게 되면, 작동이 가능하다....
이것이 가능한 이유는 JS 배열은 우리가 알고 있는 배열과 조금 다른, 희소배열
이기 때문이다. 간단하게 설명하자면, 여러 개의 자료형을 허락하는 배열이라, 한 자료가 차지하는 메모리 공간이 불규칙 할 수 있다. 이때문에 서로 연속적으로 나열되지 않을 수도 있는 자료구조이다. 이해가 안가도 좋다.
여기서 말하고 싶은 점은 우리가 이렇게 코드를 작성해도 해시 테이블을 만들 수 있다는 점이다.
하지만 JS에선 좀 더 쉽게 해시 테이블을 사용할 수 있게끔 해주는 자료구조가 있다. 우리는 이것에 좀 더 집중적으로 보려한다. 바로 MAP
이다.
Map은 key가 있는 데이터를 저장하는데 쓰이는 자료구조이다. 이때 key 값은 문자열 또한 가능하다. 따라서 이를 가지고 hash에 이용할 수 있다.
이를 이용한 간단한 코드를 보자. 이해가 안가는 부분이 있다면 아래코드를 따라가보면 이해가 쉬울 것이다.
//Map을 통해 해쉬 테이블 생성
var hashMap = new Map();
//set함수를 통해 key, value 값 대입
hashMap.set("나이", 23);
hashMap.set("직업", "개발자");
hashMap.set("전화번호", "010-xxxx-xxxx");
//Map(3) { '나이' => 23, '직업' => '개발자', '전화번호' => '010-xxxx-xxxx' }
console.log(hashMap);
//size를 통한 size 출력
//3
console.log(hashMap.size);
//has, get을 통한 if문
//23
if (hashMap.has("나이")) {
console.log(hashMap.get("나이"));
}
//delete를 통해 key가 전화번호 인것을 삭제
hashMap.delete("전화번호");
//전화번호가 삭제되었습니다. 2
if (!hashMap.has("전화번호")) {
console.log("전화번호가 삭제되었습니다.", hashMap.size);
}
이번 블로깅에서는 해시, 해쉬테이블에 대한 정의에 대해 알아보았다.
또한 기존 언어들과는 다른 JS만에서 해쉬를 다루는 법인 Map
에 대해 알아보았다. 코테를 준비하면서 해시 문제가 굉장히 많은데, 이때 이를 활용하면 보다 효율적으로 코드를 만들 수 있을 것이라 기대한다.