아. 이렇게 하면 될거 같은데.. 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은 다양한 상황에서 유용하게 사용됩니다. 주로 키-값 쌍을 빠르게 저장하고 검색할 때 사용되며, 중복된 키를 허용하지 않기 때문에 각 키는 고유해야 합니다. 구체적으로는 다음과 같은 상황에서 사용된다:

  1. 데이터 캐싱: 자주 사용되는 데이터를 메모리에 저장해두고 빠르게 접근할 수 있도록 하는 캐시 시스템에서 Map이 자주 사용된다. 예를 들어, HashMap을 사용하여 검색 속도를 최적화할 수 있다.
  2. 환경 설정: 프로그램의 환경 설정값을 키-값 쌍으로 저장하는 경우, 예를 들어 애플리케이션의 설정 파일을 읽어올 때 Properties 클래스가 Map을 구현하여 설정 정보를 관리한다.
  3. 데이터베이스 조회 결과: 데이터베이스에서 조회한 결과를 키-값 형태로 맵핑하여 관리할 때 Map을 사용하면 효율적이다. 각 행을 특정 키에 매핑하여 빠르게 검색할 수 있다.
  4. 객체 간 매핑: 복잡한 시스템에서 객체를 서로 매핑하는 용도로 Map을 사용한다. 예를 들어, 사용자 ID를 키로 하고 해당 사용자 객체를 값으로 저장하여 관리할 수 있다.
  5. 카운팅 및 통계 처리: 특정 이벤트나 데이터를 카운팅하는 데에도 Map이 사용된다. 예를 들어, 단어 빈도를 카운팅할 때 단어를 키로 하고, 등장 횟수를 값으로 저장하여 빈도수를 계산할 수 있다.
  6. 멀티스레드 환경에서 데이터 공유: 멀티스레드 환경에서 안전하게 데이터를 공유해야 할 때는 ConcurrentHashMap을 사용하여 동시성을 지원하면서 데이터를 관리한다.

이처럼 Map은 데이터를 효율적으로 관리하고 빠르게 검색해야 하는 다양한 상황에서 필수적으로 사용되는 자료구조이다.

 


🤔 느낀점

 

Map이 여러 곳에 사용된다는 사실을 다시 한번 상기 시켜 주었던 계기 였던 것 같다. Map의 구현체로는 항상 HashMap만 사용해와서 그런지 구현체가 엄청 많다는 것에 놀랐고, 다양하게 세분화 되어 있다는 사실에 놀랐다. 기회가 된다면 모든 구현체를 하나씩 공부 해 보고 싶다.

728x90
반응형