organize/프로젝트

컬렉션 프레임워크(1) Map

001cloudid 2024. 12. 3. 13:43
728x90

 컬렉션 프레임워크는 모든 자바 교재를 보면 뒷부분에 나오는 것이지만 생각보다 자주 까먹게 되는 부분인 것 같다. 따라서 정리가 필요할 것 같다는 생각이 들었다. 자주 사용하려고 노력도 필요하지만 언제, 어떤 식으로 사용되는지 등을 다시 알아보는 시간을 가져고 보자 한다.

 

Map 정의 및 특징

  • 컬렉션 프레임워크에서 키(Key)와 값(Value) 쌍으로 데이터를 저장하고 관리하는 자료 구조.
  • 데이터를 빠르게 검색, 수정, 삭제할 수 있는 기능을 제공
  • 키는 유일해야 함. 동일한 키에 대해 여러 값을 저장할 수 없음
  • 값은 중복이 가능함. 같은 값은 여러 키에 중복될 수 있음
  • null의 키와 값 Map의 일부에서는 허용됨

 

정의는 쉽게 키-값 쌍으로 저장된 구조로 간단히 정리가 되는데 map은 언제 사용할까? 라는 의문이 들었다.

Map을 사용해야 하는 상황

  1. 키와 값의 관계가 필요할 때
    키-값 쌍으로 데이터를 저장하므로, 각 키에 대한 고유한 값을 매핑해야 할 때 유용
  2. 빠른 데이터 조회가 필요할 때
    내부적으로 해시 테이블을 사용하거나 이진 트리 구조를 사용하여 데이터를 저장. 이로 인해 키를 기반으로 한 빠른 조회가 가능
  3. 키의 유일성이 필요한 경우
    Map을 가장 잘 나타낸 것이 아이디-비밀번호라고 생각함. 아이디는 중복을 허용하지 않지만, 비밀번호는 중복이 가능하기 때문. 즉 아이디가 키, 비밀번호가 값
    단, Map의 경우 동일 키에 대한 값을 덮어쓰게 됨.
    중복된 키를 저장할 수 없기 때문에 데이터의 무결성을 보장
  4. HashMap과 TreeMap
    HashMap 키의 순서가 중요하지 않은 경우
    TreeMap 키의 순서가 중요하고, 자동으로 정렬된 순서
  5. null
    키-값 모두 null을 허용할 수 있음

 

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

  • put(K key, V value)
    지정한 키와 값을 Map에 추가함. 단, 동일한 키가 이미 존재하면 기존 값을 덮어씀
  • get(Object key)
    지정된 키에 해당하는 값을 반환. 키가 없으면 null을 반환
  • remove(Object key)
    지정된 키에 해당하는 항목을 제거
  • containsKey(Object key)
    지정한 키가 Map에 존재하는지 여부를 확인
  • size()
    Map에 저장된 키-값 쌍의 수를 반환
  • isEmpty()
    Map이 비어있는지 확인
  • clear()
    Map에 저장된 모든 항목을 제거

 

Map은 인터페이스이다. 그렇다면 이를 구현해서 사용해야 하는데 구현한 것들은 뭐가 있을까?

Map을 구현한 클래스

  • HashMap
    가장 널리 사용되는 Map 구현체
    해시 테이블을 기반으로 빠른 조회 성능일 제공
    순서를 보장하지 않음. 데이터는 삽입 순서와 관계없이 저장
    null 키와 null 값 허용
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
===============================================
import java.util.HashMap;
import java.util.Map;

public class 맵 {
    public static void main(String[] args) {
        // HashMap을 생성 (학생 ID를 키로, 성적을 값으로 저장)
        Map<Integer, String> studentGrades = new HashMap<>();
        
        // 데이터를 삽입 (학생 ID, 성적)
        studentGrades.put(101, "A");
        studentGrades.put(102, "B");
        studentGrades.put(103, "A+");
        
        // 성적 조회
        System.out.println("학생 101의 성적: " + studentGrades.get(101)); // A
        
        // 특정 학생 ID가 존재하는지 확인
        System.out.println("학생 102의 성적이 있는지 확인: " + studentGrades.containsKey(102)); // true
        
        // 학생 삭제
        studentGrades.remove(103);
        System.out.println("학생 103 삭제 후: " + studentGrades);
        
        // Map의 크기 확인
        System.out.println("학생 수: " + studentGrades.size());
        
        // 모든 항목 순회
        for (Map.Entry<Integer, String> entry : studentGrades.entrySet()) {
            System.out.println("학생 ID: " + entry.getKey() + ", 성적: " + entry.getValue());
        }
    }
}
  • TreeMap
    키를 자동으로 정렬(기본적으로 오름차순)
    null키 허용하지 않음
Map<String, Integer> map = new TreeMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
  • LinkedHashMap
    HashMap처럼 데이터를 해시 테이블에 저장하지만, 삽입 순서를 유지
    HashMap처럼 빠른 조회 성능을 제공
    삽입 순서대로 데이터를 순회할 수 있음
    null키와 null 값 허용
Map<String, Integer> map = new LinkedHashMap<>();
map.put("apple", 1);
map.put("banana", 2);

 

이 외에 ~~HashMap으로 된 클래스가 있지만 프로그래밍을 할 때는 HashMap을 코딩 테스트할 때 LinkedHashMap을 사용하는 경우를 보았다.

 

정리

데이터의 키와 쌍을 이루는 경우에 사용하며 Map을 사용하면 효율적으로 데이터 처리와 관리가 가능

728x90