Map

BrokenFinger98·2024년 8월 7일

Data Structure

목록 보기
3/3

Map

Map은 키-값의 쌍을 저장하는 자료 구조이다.

  • 키는 맵 내에서 유일해야 한다. 그리고 키를 통해 값을 빠르게 검색할 수 있다.
  • 키는 중복될 수 없지만, 값은 중복될 수 있다.
  • Map은 순서를 유지하지 않는다.

Map 인터페이스의 주요 메서드

메서드설명
put(K key, V value)지정된 키와 값을 맵에 저장한다.(같은 키가 있으면 값 변경)
putAll(Map<? extends K, ? extends V> m)지정된 맵의 모든 매핑을 현재 맵에 복사한다.
putIfAbsent(K key, V value)지정된 키가 없는 경우에 키와 값을 맵에 저장한다.
get(Object key)지정된 키에 연결된 값을 반환한다.
getOrDefault(Object key, V defaultValue)지정된 키에 연결된 값을 반환한다. 키가 없는 경우 defaultValue로 지정한 값을 대신 반환한다.
remove(Object key)지정된 키와 그에 연결된 값을 맵에서 제거한다.
clear()맵에서 모든 키와 값을 제거한다.
containsKey(Object key)맵이 지정된 키를 포함하고 있는지 여부를 반환한다.
containsValue(Object value)맵이 하나 이상의 키에 지정된 값을 연결하고 있는지 여부를 반환한다.
keySet()맵의 키들을 Set형태로 반환한다.
values()맵의 값들을 Collection형태로 반환한다.
entrySet()맵의 키-값 쌍을 Set<Map.Entry<K, V>>형태로 반환한다.
size()맵에 있는 키-값 쌍의 개수를 반환한다.
isEmpty()맵이 비어 있는지 여부를 반환한다.

키 목록 조회

Set<String> keySet = studentMap.keySet()
Map의 키는 중복을 허용하지 않는다. 따라서 Map의 모든 키 목록을 조회하는 keySet()을 호출하면, 중복을 허용하지 않는 자료 구조인 Set을 반환한다.

Map은 키와 값을 보관하는 자료 구조이다. 따라서 키와 값을 하나로 묶을 수 있는 방법이 필요하다. 이때 Entry를 사용한다.
Entry는 키-값의 쌍으로 이루어진 간단한 객체이다. EntryMap내부에서 키와 값을 함께 묶어서 저장할 때 사용한다.
쉽게 이야기해서 우리가 Map에 키와 값으로 데이터를 저장하면 Map은 내보에서 키와 값을 하나로 묶는 Entry객체를 만들어서 보관한다. 참고로 하나의 Map에 여러 Entry가 저장될 수 있다.
참고로 EntryMap내부에 있는 인터페이스이다. 우리는 구현체보다는 이 인터페이스를 사용하면 된다.

값 목록 조회

Collection<Integer> values = studentMap.values()
Map의 값 목록을 중복을 허용한다. 따라서 중복을 허용하지 않는 Set으로 반환할 수는 없다. 그리고 입력 순서를 보장하지 않기 때문에 순서를 보장하는 List로 반환하기도 애매하다. 따라서 단순히 값의 모음이라는 의미의 상위 인터페이스인 Collection으로 반환한다.

Map 구현체

자바의 Map인터페이스는 키-값 쌍을 저장하는 자료 구조이다. Map은 인터페이스이기 때문에, 직접 인스턴스를 생성할 수는 없고, 대신 Map인터페이스를 구현한 여러 클래스를 통해 사용할 수 있다. 대표적으로 HashMap, TreeMap, LinkedHashMap이 있다.

Map vs Set

그런데 Map을 어디서 많이 본 것 같지 않은가? Map의 키는 중복을 허용하지 않고, 순서를 보장하지 않는다.
Map의 키가 바로 Set과 같은 구조이다. 그리고 Map은 모든 것이 Key를 중심으로 동작한다.
Value는 단순히 Key옆에 따라 붙은 것 뿐이다. Key옆에 Value만 하나 추가해주면 Map이 되는 것이다.
MapSet은 거의 같다. 단지 옆에 Value를 가지고 있는가 없는가의 차이가 있을 뿐이다.

이런 이유로 SetMap의 구현체는 거의 같다.

  • HashSet -> HashMap
  • LinkedHashSet -> LinkedHashMap
  • TreeSet -> TreeMap
    참고: 실제로 자바 HashSet의 구현은 대부분 HashMap의 구현을 가져다 사용한다. Map에서 Value만 비워두면 Set으로 사용할 수 있다.

1. HashMap

  • 구조: HashMap은 해시를 사용해서 요소를 저장한다. 키(Key) 값은 해시 함수를 통해 해시 코드로 변환되고, 이 해시 코드는 데이터를 저장하고 검색하는 데 사용된다.
  • 특징: 삽입, 삭제, 검색 작업은 해시 자료 구조를 사용하므로 일반적으로 상수 시간 O(1)의 복잡도를 가진다.
  • 순서: 순서를 보장하지 않는다.

2. LinkedHashMap

  • 구조: LinkedHashMapHashMap과 유사하지만, 연결 리스트를 사용하여 삽입 순서 또는 최근 접근 순서에 따라 요소를 유지한다.
  • 특징: 입력 순서에 따라 순회가 가능하다. HashMap과 같지만 입력 순서를 링크로 유지해야 하므로 조금 더 무겁다.
  • 성능: HashMap과 유사하게 대부분의 작업은 O(1)의 시간 복잡도를 가진다.
  • 순서: 입력 순서를 보장한다.

3. TreeMap

  • 구조: TreeMap은 레드-블랙 트리를 기반으로 한 구현이다.
  • 특징: 모든 키는 자연 순서 또는 생성자에 제공된 Comparator에 의해 정렬된다.
  • 성능: get, put, remove와 같은 주요 작업들은 O(log n)의 시간 복잡도를 가진다.
  • 순서: 키는 정렬된 순서로 저장된다
profile
나는야 개발자

0개의 댓글