Map

김성호·2023년 3월 17일
0

자료구조

목록 보기
5/7

Map이란?

키-값 쌍(key-value pair)으로 데이터를 저장하는 추상 데이터 타입(ADT)입니다. 모든 키는 유일해야 하며, 값은 중복될 수 있습니다. Map은 키를 기반으로 검색, 삽입, 삭제 연산이 빠르기 때문에 데이터를 빠르게 저장하고 검색할 때 유용합니다.

Java에서 Map은 java.util 패키지에서 구현되며, 대표적으로 HashMap, TreeMap, LinkedHashMap 클래스가 있습니다. HashMap은 해시 테이블을 사용하여 키-값 쌍을 저장하며, TreeMap은 이진 검색 트리를 사용하여 키-값 쌍을 저장합니다. LinkedHashMap은 HashMap과 비슷하지만, 삽입 순서를 기억합니다.

Map의 연산

  1. put(key, value): key와 value를 쌍으로 Map에 추가합니다.
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 100);
map.put("banana", 200);
map.put("cherry", 300);
  1. get(key): key에 해당하는 value를 반환합니다.
int value = map.get("apple");
System.out.println(value); // 100
  1. remove(key): key에 해당하는 key-value 쌍을 제거합니다.
map.remove("banana");
  1. containsKey(key): key가 Map에 있는지 확인합니다.
boolean containsKey = map.containsKey("apple");
System.out.println(containsKey); // true
  1. containsValue(value): value가 Map에 있는지 확인합니다.
boolean containsKey = map.containsKey("apple");
System.out.println(containsKey); // true
  1. size(): Map의 크기를 반환합니다.
int size = map.size();
System.out.println(size); // 3
  1. isEmpty(): Map이 비어있는지 확인합니다.
boolean isEmpty = map.isEmpty();
System.out.println(isEmpty); // false
  1. keySet(): Map의 모든 key를 Set 형태로 반환합니다.
Set<String> keys = map.keySet();
System.out.println(keys); // [apple, cherry]
  1. values(): Map의 모든 value를 Collection 형태로 반환합니다.
Collection<Integer> values = map.values();
System.out.println(values); // [100, 300]
  1. entrySet(): Map의 모든 key-value 쌍을 Set 형태로 반환합니다.
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의 구현

  1. HashMap
    해시테이블을 사용하여 key-value 쌍을 저장하고 검색하는 기능을 제공합니다. 해시테이블은 배열과 연결리스트를 사용하여 구현되어 있으며, 데이터의 삽입, 삭제, 검색 등의 연산이 모두 O(1)의 시간복잡도를 가집니다.
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.");
}
  1. TreeMap
    이진 검색 트리를 사용하여 key-value 쌍을 저장하고 검색하는 기능을 제공합니다. 이진 검색 트리는 노드의 크기 순서에 따라 key를 정렬하여 저장하므로, 검색 기능의 성능은 O(log n)입니다.
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.");
}
  1. LinkedHashMap
    해시테이블과 연결리스트를 사용하여 key-value 쌍을 저장하고 검색하는 기능을 제공합니다. HashMap과 유사하지만, 입력된 순서대로 데이터를 유지하는 특징을 가지고 있습니다.
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.");
}
  1. WeakHashMap
    GC(Garbage Collector)와 연동하여, key에 대한 참조가 없어지면 해당 key-value 쌍을 자동으로 제거합니다. 따라서, 메모리 누수를 방지하기 위해 사용됩니다.

  2. 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을 사용하고자 할 때 위와 같은 방법으로 구현할 수 있으며 각각의 특징을 알고 적절한 환경에서 사용할 수 있어야 합니다.

Map의 활용

  1. 웹 개발: HTTP 요청/응답에 대한 정보를 Map 형태로 관리하는 경우가 많습니다. 예를 들어, HTTP Request에서 Parameter를 저장하는데 많이 사용됩니다.

  2. 데이터베이스: 데이터베이스에서도 Map 형태로 데이터를 저장합니다. 예를 들어, NoSQL 데이터베이스인 MongoDB는 Map 형태로 데이터를 저장합니다.

  3. 게임 개발: 게임에서 아이템, 유저 정보 등을 Map 형태로 관리합니다.

  4. 인공지능: 인공지능에서는 Map을 사용하여, 데이터의 Key에 따라서 처리를 분기하는 경우가 있습니다.

  5. 기타: 파일 시스템, 프로그램 설정 정보, 메시지 처리 등에서도 Map을 활용할 수 있습니다.

profile
개발공부하는사람

0개의 댓글