키-값 쌍(key-value pair)으로 데이터를 저장하는 추상 데이터 타입(ADT)입니다. 모든 키는 유일해야 하며, 값은 중복될 수 있습니다. Map은 키를 기반으로 검색, 삽입, 삭제 연산이 빠르기 때문에 데이터를 빠르게 저장하고 검색할 때 유용합니다.
Java에서 Map은 java.util 패키지에서 구현되며, 대표적으로 HashMap, TreeMap, LinkedHashMap 클래스가 있습니다. HashMap은 해시 테이블을 사용하여 키-값 쌍을 저장하며, TreeMap은 이진 검색 트리를 사용하여 키-값 쌍을 저장합니다. LinkedHashMap은 HashMap과 비슷하지만, 삽입 순서를 기억합니다.
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 100);
map.put("banana", 200);
map.put("cherry", 300);
int value = map.get("apple");
System.out.println(value); // 100
map.remove("banana");
boolean containsKey = map.containsKey("apple");
System.out.println(containsKey); // true
boolean containsKey = map.containsKey("apple");
System.out.println(containsKey); // true
int size = map.size();
System.out.println(size); // 3
boolean isEmpty = map.isEmpty();
System.out.println(isEmpty); // false
Set<String> keys = map.keySet();
System.out.println(keys); // [apple, cherry]
Collection<Integer> values = map.values();
System.out.println(values); // [100, 300]
Set<Map.Entry<String, Integer>> entries = map.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
// apple : 100
// cherry : 300
Map<String, Integer> hashMap = new HashMap<>();
// HashMap에 key-value쌍을 삽입합니다.
hashMap.put("Alice", 25);
hashMap.put("Bob", 30);
hashMap.put("Charlie", 35);
// key로 value를 탐색합니다.
Integer bobAge = hashMap.get("Bob"); // 30을 반환합니다.
// HashMap에 key가 있는지 확인합니다.
boolean hasCharlie = hashMap.containsKey("Charlie"); // 있으면 true를 반환합니다.
// HashMap에서 키-값 쌍을 반복합니다.
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
String name = entry.getKey();
Integer age = entry.getValue();
System.out.println(name + " is " + age + " years old.");
}
Map<String, Integer> treeMap = new TreeMap<>();
// TreeMap에 key-value쌍을 삽입합니다.
treeMap.put("Alice", 25);
treeMap.put("Bob", 30);
treeMap.put("Charlie", 35);
// key로 value를 탐색합니다.
Integer bobAge = treeMap.get("Bob"); // returns 30
// TreeMap에 key가 있는지 확인합니다.
boolean hasCharlie = treeMap.containsKey("Charlie"); // 있으면 true를 반환합니다.
// TreeMap에서 키-값 쌍을 반복합니다.
for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
String name = entry.getKey();
Integer age = entry.getValue();
System.out.println(name + " is " + age + " years old.");
}
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
// Add key-value pairs to the LinkedHashMap
linkedHashMap.put("Alice", 25);
linkedHashMap.put("Bob", 30);
linkedHashMap.put("Charlie", 35);
// Get value by key
Integer bobAge = linkedHashMap.get("Bob"); // returns 30
// Check if key exists in LinkedHashMap
boolean hasCharlie = linkedHashMap.containsKey("Charlie"); // returns true
// Iterate over the key-value pairs in the LinkedHashMap
for (Map.Entry<String, Integer> entry : linkedHashMap.entrySet()) {
String name = entry.getKey();
Integer age = entry.getValue();
System.out.println(name + " is " + age + " years old.");
}
WeakHashMap
GC(Garbage Collector)와 연동하여, key에 대한 참조가 없어지면 해당 key-value 쌍을 자동으로 제거합니다. 따라서, 메모리 누수를 방지하기 위해 사용됩니다.
ConcurrentHashMap
멀티스레드 환경에서 안전하게 사용할 수 있는 해시테이블 기반의 Map입니다. 동기화 처리를 통해 멀티스레드 환경에서 안전하게 데이터를 저장하고 검색할 수 있습니다.
ConcurrentMap<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();
// Add key-value pairs to the ConcurrentHashMap
concurrentHashMap.put("Alice", 25);
concurrentHashMap.put("Bob", 30);
concurrentHashMap.put("Charlie", 35);
// Get value by key
Integer bobAge = concurrentHashMap.get("Bob"); // returns 30
// Check if key exists in ConcurrentHashMap
boolean hasCharlie = concurrentHashMap.containsKey("Charlie"); // returns true
// Iterate over the key-value pairs in the ConcurrentHashMap
for (Map.Entry<String, Integer> entry : concurrentHashMap.entrySet()) {
String name = entry.getKey();
Integer age = entry.getValue();
System.out.println(name + " is " + age + " years old.");
}
구현코드는 비슷합니다. Map을 사용하고자 할 때 위와 같은 방법으로 구현할 수 있으며 각각의 특징을 알고 적절한 환경에서 사용할 수 있어야 합니다.
웹 개발: HTTP 요청/응답에 대한 정보를 Map 형태로 관리하는 경우가 많습니다. 예를 들어, HTTP Request에서 Parameter를 저장하는데 많이 사용됩니다.
데이터베이스: 데이터베이스에서도 Map 형태로 데이터를 저장합니다. 예를 들어, NoSQL 데이터베이스인 MongoDB는 Map 형태로 데이터를 저장합니다.
게임 개발: 게임에서 아이템, 유저 정보 등을 Map 형태로 관리합니다.
인공지능: 인공지능에서는 Map을 사용하여, 데이터의 Key에 따라서 처리를 분기하는 경우가 있습니다.
기타: 파일 시스템, 프로그램 설정 정보, 메시지 처리 등에서도 Map을 활용할 수 있습니다.