티스토리 뷰


해시맵은 맵(C++)이라고도 하고 사전(파이썬)이라고도 불리는 자료구조로 프로그램에서 매우 중요하고 가장 널리 쓰이는 자료구조다. 키를 이용하여 키(key)에 따라 값(value)을 인덱싱하는 목적이다. 검색하거나 키로 값을 접근해야 되는 일이 자주 발생하는 경우 거의 해시맵을 통해 이를 인덱싱해 둔다. 그러면 값을 넣을 때는 해싱을 하고 인덱싱을 해두어야 하므로 계산시간이나 메모리가 약간 더 소요되지만 키로 값을 접근할 때는 O(1) 만에, 즉 단번에 그 값에 접근이 가능하다. 예를 든다면 학번으로 학생 객체를 찾거나 주민번호로 사용자 객체를 찾거나 우편번호로 주소를 찾는 등 우리는 사실 실생활에서도 키를 이용해 값을 찾는 사례를 많이 가지고 있다. 파이썬이 해시맵을 딕셔너리(사전)이라고 부르는 이유도 사전이 단어로 뜻을 찾는 대표적인 맵의 예이기 때문이다.

자바에서 해시맵은 ArrayList와 마찬가지로 콜렉션 라이브러리 클래스의 하나다. 숫자를 키로, 스트링을 값으로 가지는 해시맵의 생성은 다음과 같다.

HashMap<Integer, String>intToStringMap = new HashMap<>();

해시맵에 값을 넣는 것은 put 메소드로 가능하다. 키와 값의 쌍을 주면 맵에 등록된다. 키에 대해 값을 찾는 것은 get으로 가능하다. 해당하는 키가 없으면 null이 돌아온다.

intToStringMap.put(1, "first");

intToStringMap.put(2, "second"); String value = intToStringMap.get(n);

한편 키가 이미 등록되어 있는지 확인하는 방법은 containsKey를 사용한다. 다음 프로그램은 단어에 대해 등장회수를 가지는 해시맵을 정의하는데, 이것은 단어가 키고 값은 int가 된다. 단어를 읽어서 키가 이미 등록되어 있으면 단어의 등장회수를 1 증가시킨다. 등록되어 있지 않으면 put으로 원래 카운트를 1 증가시켜 등록한다.

String word = null;
while (true) {
    word = scan.next();
    if (word.equals("end"))
	break;
    if (map.containsKey(word))
        map.put(word, map.get(word) + 1);
    else
	map.put(word, 1);
}
System.out.println(map);

한가지 주의할 사항은 해시맵은 키의 순서가 추가된 순서와 달라질 수 있다는 점이다. 키는 해시값에 의해 순서대로 나타나게 되는데 foreach 문으로 키를 차례로 방문하면 입력된 순서와 상관없이 출력된다.[각주:1]

위의 프로그램에서 만들어진 해시맵을 차례로 출력해보자. 등장하는 단어의 순서는 입력된 순서도 아니고 사전순도 아니다.

one two three one four two five four one end
{four=2, one=3, two=2, three=1, five=1}


  1. 해시값은 객체를 구분g하기 위해 만들어진 수식으로 계산된다. 이 값으로 정렬하면 우리가 보기에는 랜덤한 순서로 보인다. [본문으로]
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함