본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/xml

[JAVA] map 맵 hashmap 사용 방법 - linkedhashmap, hashtable 설명

by 미노드 2023. 5. 9.

맵(Map)은 사전(dictionary)과 비슷하다.
people 이란 단어에 "사람", baseball 이라는 단어에 "야구"라는 뜻이 부합되듯이
Map은 Key와 Value를 한 쌍으로 갖는 자료형이다.

map에는 hashmap과 hashtable로 나뉘는데 hash라는게 붙어 혼돈을 준다.
해시함수를 사용하여 키를 해시값으로 매핑하고, 이 해시값을 색인(인덱스) 또는 주소삼아 데이터를 key와 함께 저장하는 자료구조라서 이름에 hash를 붙인다고 한다.

해시 함수(hash function) 또는 해시 알고리즘(hash algorithm) 또는 해시함수알고리즘(hash函數algorithm)은 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수다.
해시 함수에 의해 얻어지는 값은 
해시 값, 해시 코드, 해시 체크섬 또는 간단하게 해시라고 한다.

이 함수는 hashtable, hashmap 에서 이용되며 이를 구분하기위해 간단히 정리하자면 다음과 같다.

HashMap -> 비동기 처리, HashTable 동기 처리
HashMap -> null 입력 가능, HashTable null 입력 불가능

용도에 맞게 선택해서 사용하면 된다.

 ※ 자바에서 Map 과 List는 인터페이스다. 실질적으로 선언할 때 new 뒤에 Arraylist나 Hashmap으로 붙여야 한다.
List A = new List(); 이러면 에러뜬다.

put

key와 value가 String 형태인 HashMap의 예제이며, put 메소드로 key와 value를 추가할 수 있다.
만약, put 할때 key가 같은 값으로 put한다면 덮어쓰기가 되니 참고하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.HashMap;
 
import lombok.extern.slf4j.Slf4j;
 
@Slf4j
public class SampleMap {
    public static void main(String[] args) {
        HashMap<StringString> map = new HashMap<StringString>();
        map.put("name""미노드");
        map.put("age""32");
        map.put("favorit""농구, 수영, 요리하기");
                
        log.info("map {}",map);
    }
}
cs
1
map {name=미노드, favorit=농구, 수영, 요리하기, age=32}
cs

결과를 보면 put한 순서가 보장이 안되는데, 이는 hashmap이 비동기 처리를 지원하기 때문이다.
순서를 보장하는 기능을 쓰려면 linkedhashmap이나 hashtable을 쓰자.

잠깐 다른 종류의 map 들에 대해 설명하자면 다음과 같다.

  • LinkedHashMap은 입력된 순서대로 데이터를 저장하는 특징을 가지고 있다.
  • TreeMap은 입력된 key의 오름차순 순서로 데이터를 저장하는 특징을 가지고 있다.

get

key에 해당하는 value값을 얻기 위해서는 get 메서드를 사용한다.

1
log.info("map name : {}",map.get("name"));
cs
1
map name : 미노드
cs

getOrDefault

맵의 key에 해당하는 value가 없을 경우에 get 메서드를 사용하면 다음처럼 null이 리턴된다.

1
log.info("map name : {}",map.get("tron"));  // null 출력
cs
1
null
cs

null 대신 디폴트 값을 얻고 싶은 경우에는 getOrDefault 메서드를 사용한다.

1
log.info("map name : {}",map.getOrDefault("tron","기본"));
cs
1
기본
cs

containsKey

containsKey 메서드는 맵(Map)에 해당 키(key)가 있는지를 조사하여 그 유무를 참, 거짓으로 리턴한다.

1
log.info("map name : {}",map.containsKey("name"));
cs
1
true
cs

remove

remove 메서드는 맵(Map)의 항목을 삭제하는 메서드로 key값에 해당되는 아이템(key, value)을 삭제한 후 그 value 값을 리턴한다.

1
2
3
log.info("map remove name : {}",map.remove("people")); 
log.info("map remove name : {}",map.remove("name")); 
log.info("map {}",map);
cs
1
2
3
map remove name : null
map remove name : 미노드
map {favorit=농구, 수영, 요리하기, age=32}
cs

size

size 는 Map의 key:value 쌍의 갯수를 리턴한다.
value가 null인 것도 포함해서 센다.

1
log.info("map size {}",map.size());
cs
1
3
cs

keySet, values

keySet은 맵(Map)의 모든 key 나 value를 모아서 리턴한다.
value에 콤마가 들어간 값이 있으면 구분하기 어렵게 나오니 주의할 필요가 있어보인다.

1
2
log.info("map keySet {}",map.keySet());
log.info("map values {}",map.values());
cs
1
2
map keySet [name, favorit, age]
map values [미노드, 농구, 수영, 요리하기, 32]
cs

keySet() 메서드는 Map의 모든 Key를 모아서 Set 자료형으로 리턴한다.
Set 자료형은 다음과 같이 List 자료형으로 바꾸어 사용할수도 있다.

1
List<String> keyList = new ArrayList<>(map.keySet());
cs
1
list keyList [name, favorit, age]
cs