기본기를 다지자/자료구조
[java] Map
아. 이렇게 하면 될거 같은데..
2025. 3. 3. 00:40
728x90
📌 Map이란?
Map이란 키-값을 저장하는 자료 구조 이다. 각 키는 중복될 수 없으며, 각 키는 하나의 값에만 매핑된다. 즉 하나의 키는 하나의 값과 연결되며, 동일한 키를 다시 추가하면 기존 값이 덮어쓰여 진다.
Map의 구현체로는 HashMap, TreeMap, LinkedHashMap 등이 있다.
자바 공식문서를 확인해 보자
자바 Doc를 요약해보자면
- Map은 키-값 쌍을 저장하며, 중복된 키를 허용하지 않는다.
- 세 가지 컬렉션 뷰(키, 값, 키-값 쌍)를 제공한다.
- 키로는 변경 가능한 객체를 사용하는 것이 위험할 수 있다.
- 표준 생성자로는 인자가 없는 생성자와 다른 맵을 복사하는 생성자가 있다.
- 적절하지 않은 키나 값을 삽입 시 예외가 발생할 수 있다.
- 일부 메서드는 equals 메서드를 기반으로 동작하며, 최적화를 통해 equals 호출을 생략할 수 있다.
- 자기 참조적인 Map에서 재귀적으로 메서드를 호출할 경우 예외가 발생할 수 있다.
📌 다양한 Map의 구현체들
구현체들을 확인해보자
뭐가 엄청 많다... 그래도 하나씩 정리 해보자면
구현체 클래스 | 설명 | 용도 및 특징 |
AbstractMap | Map의 기본 동작을 제공하는 추상 클래스 | 직접 사용되지 않고 다른 Map 구현체를 만들 때 기본 클래스로 사용됨 |
Attributes | 디렉토리 서비스의 속성을 나타내는 클래스 | 디렉토리 및 네이밍 서비스에서 사용됨 |
AuthProvider | 보안 인증을 위한 공급자 클래스 | 보안 관련 인증 서비스 제공 |
ConcurrentHashMap | 동시성에 최적화된 HashMap 구현체 | 멀티스레드 환경에서 사용, 여러 스레드가 동시에 접근해도 안전함 |
ConcurrentSkipListMap | 동시성을 지원하는 NavigableMap구현체, 정렬 지원 | 멀티스레드 환경에서 사용, 키가 자동으로 정렬됨 |
EnumMap | 열거형을 키로 사용하는 구현체 | 키로 열거형을 사용할 때 성능 최적화 |
HashMap | 가장 일반적인 Map구현체 | 성능이 뛰어나고, 순서가 유지되지 않음 |
HashTable | 동기화된 HashMap과 유사한 구현체 | 멀티스레드 환경에서 사용되며, 성능은 떨어지지만 동기화를 지원함 |
IdentityHashMap | 객체의 참조 주소를 기준으로 키를 비교하는 Map | 참조 동등성(객체의 메모리 주소)을 기준으로 키를 비교함 |
LinkedHashMap | 입력된 순서 또는 접근 순서를 유지하는 HashMap 구현체 | 순서가 중요한 경우 사용, 삽입 순서나 접근 순서 유지 |
PrinterStateReasons | 프린터 상태를 나타내는 이유와 관련된 특수한 Map 구현체 | 프린터 상태 및 이유 관리 |
Properties | 키와 값이 문자열인 특수한 Map 구현체 | 애플리케이션 설정 파일(.properties)을 처리할 때 사용됨 |
Provider | 보안 서비스 제공자에 대한 정보와 설정을 관리하는 클래스 | 암호화, 인증과 같은 보안 서비스 제공자 설정 관리 |
RenderingHints | 그래픽 렌더링 최적화를 위한 힌트를 저장하는 Map 구현체 | 그래픽 관련 힌트 저장, Java 2D API에서 사용 |
SimpleBindings | 스크립트 엔진과 Java 객체 간 바인딩을 지원하는 Map 구현체 | Java와 스크립트 간의 상호작용 관리 |
TabularDataSupport | JMX에서 테이블 형태의 데이터를 관리하는 Map 구현체 | Java 관리 확장을 위한 API에서 사용됨 |
TreeMap | 키가 자동으로 정렬되는 Map 구현체 | 키를 정렬해야 할 때 사용, 기본적으로는 오름차순 정렬 |
UIDefaults | Swing 컴포넌트의 UI 기본 설정을 관리하는 Map구현체 | Swing 컴포턴트의 스타일 설정 관리 |
WeakHashMap | 키에 대한 약한 참조를 사용하는 Map구현체 | 가비지 컬렉션이 가능한 키를 사용할 때, 메모리 누수를 방지할 때 사용 |
여기서 자주 사용하는 HashMap, TreeMap, LinkedHashMap, HashTable 은 따로 포스팅 할 예정이다.
📌 Map이 어디에 사용될까?
Map은 다양한 상황에서 유용하게 사용됩니다. 주로 키-값 쌍을 빠르게 저장하고 검색할 때 사용되며, 중복된 키를 허용하지 않기 때문에 각 키는 고유해야 합니다. 구체적으로는 다음과 같은 상황에서 사용된다:
- 데이터 캐싱: 자주 사용되는 데이터를 메모리에 저장해두고 빠르게 접근할 수 있도록 하는 캐시 시스템에서 Map이 자주 사용된다. 예를 들어, HashMap을 사용하여 검색 속도를 최적화할 수 있다.
- 환경 설정: 프로그램의 환경 설정값을 키-값 쌍으로 저장하는 경우, 예를 들어 애플리케이션의 설정 파일을 읽어올 때 Properties 클래스가 Map을 구현하여 설정 정보를 관리한다.
- 데이터베이스 조회 결과: 데이터베이스에서 조회한 결과를 키-값 형태로 맵핑하여 관리할 때 Map을 사용하면 효율적이다. 각 행을 특정 키에 매핑하여 빠르게 검색할 수 있다.
- 객체 간 매핑: 복잡한 시스템에서 객체를 서로 매핑하는 용도로 Map을 사용한다. 예를 들어, 사용자 ID를 키로 하고 해당 사용자 객체를 값으로 저장하여 관리할 수 있다.
- 카운팅 및 통계 처리: 특정 이벤트나 데이터를 카운팅하는 데에도 Map이 사용된다. 예를 들어, 단어 빈도를 카운팅할 때 단어를 키로 하고, 등장 횟수를 값으로 저장하여 빈도수를 계산할 수 있다.
- 멀티스레드 환경에서 데이터 공유: 멀티스레드 환경에서 안전하게 데이터를 공유해야 할 때는 ConcurrentHashMap을 사용하여 동시성을 지원하면서 데이터를 관리한다.
이처럼 Map은 데이터를 효율적으로 관리하고 빠르게 검색해야 하는 다양한 상황에서 필수적으로 사용되는 자료구조이다.
🤔 느낀점
Map이 여러 곳에 사용된다는 사실을 다시 한번 상기 시켜 주었던 계기 였던 것 같다. Map의 구현체로는 항상 HashMap만 사용해와서 그런지 구현체가 엄청 많다는 것에 놀랐고, 다양하게 세분화 되어 있다는 사실에 놀랐다. 기회가 된다면 모든 구현체를 하나씩 공부 해 보고 싶다.
728x90
반응형