본문 바로가기

빅데이터/개념 정리

HashMap(해쉬맵)에 대한 개념과 사용방법

 

 

HashMap 이란?

 

Java Collections Framework에 속한 구현체 클래스이면서, Map 인터페이스를 구현한 함수이다. 
따라서 데이터의 저장은 key, value 형태가 된다.  key 값의 hashCode를 index로 Araay에 값을 저장한다. 따라서 검색속도는 매우 빠르다.
그리고 해싱(Hashing) 검색을 사용하기 때문에 대용량 데이터 관리에도 좋은 성능을 보여주고 있다. 
key 값은 중복이 되지 않고, value 값은 허용이 된다.

 

 

 

'키에 대한 해시 값을 사용하여 값을 저장하고 조회하며, 키-값 쌍의 개수에 따라 동적으로 크기가 증가하는 associate array'이다.  (출처: https://d2.naver.com/helloworld/831311)
이 associate array를 지칭하는 다른 용어가 있는데, 대표적으로 Map, Dictionary, Symbol Table 등이다.

 

 

map(또는 mapping)은 원래 수학 함수에서의 대응 관계를 지칭하는 용어로, 경우에 따라서는 함수 자체를 의미하기도 한다. 
즉 HashMap이란 이름에서 알 수 있듯이, HashMap은 키 집합인 정의역과 값 집합인 공역의 대응에 해시 함수를 이용한다.

 

 

 

 

HashMap: 데이터를 넣는 방법


 

HashMap 에서 데이터를 넣는 방법은 put() 함수를 사용한다. 첫번째 인수로 key 값을 넣고, 두번째 인수로 value 를 입력한다. 
key 값에 integer가 아닌 소수점이 있는 실수를 사용하면 error가 난다.

 

 
1
2
3
4
5
6
7
8
9
10
// 해쉬맵
HashMap<Integer, String> map = new HashMap<Integer, String>();
// 값넣는 방법
map.put(1"매실");
map.put(2"식혜");
map.put(3"수정과");
map.put(2"커피");
// map.put(4.0, "쥬스"); // 컴파일 에러
 
System.out.println(map);
 
1
2
// 출력
{1=매실, 2=커피, 3=수정과}

 

여기서 한가지 주의할 점은 key 값은 중복이 되지 않고, value 값은 허용한다는 점이다. 위 5라인과 7라인 처럼 key 값이 중복된다면 최종 2에 저장된 value 는 "커피"로 나중에 입력된 key의 value로 덮어 씌어 진다.

 

 

 

 

HashMap: 값 가져오기



저장할때 key 값을 저장하기 때문에 get() 함수의 인수로 찾고 싶은 key 값을 넘기면 된다.

 

 
1
2
3
4
5
6
7
8
// Key 로 값을 가져오는 방법
map.put(1"매실");
map.put(2"식혜");
map.put(3"수정과");
map.put(2"커피");
 
String val = map.get(2).toString();
System.out.println("key 값이 2 데이터 : " + val);

 

1
2
// 출력
key 값이 2 데이터 :  커피
 
 
 
 

HashMap: 반복문으로 데이터 꺼내오기


 

 

Iterator ?

자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 데이터를 읽어오는 방법중 하나이다.

 

 
1
2
3
4
5
6
7
8
9
public interface Iterator {
 
boolean hasNext();
 
Object next();
 
void remove();
 
}

 

 

boolean hasNext()  는 읽어 올 요소가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환한다.
Object next()  는 다음데이터를 반환한다.
void remove()  는 next()로 읽어 온 요소를 삭제한다. next() 를 호출한 다음에 remove() 를 호출해야 한다. 

 

Iterator 타입에 변수를 생성하고 컬렉션에 iterator 메서드를 값으로 넣는다.

List타입의 변수를 iterator으로 변환한다.

 

1
2
3
4
Iterator iter = listTest.iterator();
while(iter.hasNext()) {
 
}

 

여기서 hasNaxt 메서드는 while 반복문으로 iter 변수에 다음데이터가 있을 때 까지 실행한다.

 

1
2
3
4
Iterator iter = listTest.iterator();
while(iter.hasNext()) {
    System.out.println(iter.next());
}
 

 

while문에 조건을 hasNext() 로 검사한 뒤 next() 로 데이터를 반환한다.

 

iterator 메서드 호출순서는 1. hasNext -> 2. next -> 3. remove 이다.
List 혹은 Set 인터페이스를 구현하는 컬렉션은 iterator() 가 컬렉션의 특징에 맞게 설계가 되어있다.

 

 

 

HashMap 은 iterator() 로 Iterator 객체를 리턴한다. 
Iterator 객체는 반복문으로 데이터를 처리할 때 아주 유용하다. 
앞에 예시처럼 hasNext() 함수로 null 인지 판단해서 while 문으로 반복한다. 
그리고 차례대로 데이터를 가져올수 있는 next() 함수로 값을 꺼낸다. 이렇게 next() 로 꺼낸 값은 value 가 아니라 key 값입니다.
수고스럽게도 key 값에 해당하는 value 를 가져올려면 다시 get() 함수를 사용해야 한다.

 

1
2
3
4
5
6
7
8
9
map.put(1"매실");
map.put(2"식혜");
map.put(3"커피");
 
Iterator<Integer> keySetIterator = map.keySet().iterator();
while (keySetIterator.hasNext()) {
    Integer key = keySetIterator.next();
    System.out.println("key: " + key + " value: " + map.get(key));
}

 

1
2
3
4
// 출력
key: 1 value: 매실
key: 2 value: 식혜
key: 3 value: 커피

 

 

 

 

HashMap: 저장된 데이터 지우기


 

HashMap 객체에 저장된 데이터를 한번에 지우기

 

 

1
2
3
4
5
6
7
8
9
10
11
map.put(1"매실");
map.put(2"식혜");
map.put(3"커피");
 
System.out.println(map);
map.clear(); // 삭제
System.out.println(map);
 
// 빈 객체인지 체크하는 isEmpty 함수
boolean isEmpty = map.isEmpty();
System.out.println("비어 있는지 체크: " + isEmpty);

 

1
2
3
4
// 출력
{1=매실, 2=식혜, 3=커피}
{}
비어 있는지 체크: true

 

clear() 함수는 저장된 모든 데이터를 지우며, null 포인트를 만드는 것은 아니다.  
이렇게 지우고 나서 데이터가 있는지 체크해 볼수 있는 함수가 isEmpty() 이다. clear() 로 지웠으니까 결과는 true 가 된다.

 

 

 

특정 key 값에 해당하는 데이터 지우기

 

1
2
3
4
5
6
7
8
// 특정 값 삭제하기
map.put(1"매실");
map.put(2"식혜");
map.put(3"커피");
 
Integer key = 3;
Object value = map.remove(key);
System.out.println("Key 값 삭제후 데이터 리턴받은 결과 : " + value);

 

1
2
// 출력
Key 값 삭제후 데이터 리턴받은 결과 :  커피

 

remove() 함수의 인수로 key 값을 넘기면 해당 데이터를 지울수 있다.

 

 

 

 

HashMap: 데이터 정렬하기


 

값의 정렬이 아닌 key 값에 대한 정렬이다. TreeMap 클래스를 생성할 때 HashMap 객체를 넘기면 된다. 그럼 내부적으로 정렬을 시키게 된다.

1
2
3
4
5
6
7
map.put(21"식혜");
map.put(10"매실");
map.put(31"커피");
 
System.out.println("정렬하지 않았을때 : " + map);
TreeMap sortedHashMap = new TreeMap(map);    
System.out.println("정렬했을때 : " + sortedHashMap);

 

1
2
3
// 출력
정렬하지 않았을때 : {21=식혜, 10=매실, 31=커피}
정렬했을때 : {10=매실, 21=식혜, 31=커피}