JAVA

[JAVA] Map 개요

인생아 2024. 11. 2. 11:47
반응형

MapJava Collection Framework의 주요 구성 요소로, 키(Key)와 값(Value)의 쌍으로 데이터를 저장하는 자료 구조입니다. Key를 사용해 Value에 빠르게 접근할 수 있어 검색이 자주 필요한 경우 유용합니다. 이때, Key고유해야 하며 Value는 중복이 가능합니다.

Java Collection Framework에서 MapListSet과 다르게 단일 값이 아닌 Key-Value 형태로 데이터를 다루는 특징이 있습니다. 이러한 구조 덕분에 HashMap이나 TreeMap처럼 빠른 검색 성능을 제공하며 다양한 사용 사례에 적합합니다.

import java.util.HashMap;
import java.util.Map;

public class MapExample {
    public static void main(String[] args) {
        Map<String, Integer> studentAges = new HashMap<>();
        studentAges.put("Alice", 23);
        studentAges.put("Bob", 21);
        studentAges.put("Charlie", 22);

        System.out.println("Alice's Age: " + studentAges.get("Alice"));
    }
}

Java Collection Framework에서 Map의 위치

Map 인터페이스는 Java의 Collection Framework에 포함되어 있지만 Collection 인터페이스를 상속받지는 않습니다. Map은 List나 Set과는 달리 키와 값을 한 쌍으로 다루기 때문에, 독립적인 역할을 수행합니다. 특히 HashMap, TreeMap, LinkedHashMap 등의 다양한 구현체가 제공되어 요구 사항에 따라 최적의 Map을 선택할 수 있습니다.

  • HashMap: 가장 많이 사용되는 Map 구현체로, 해시 알고리즘을 사용해 빠른 접근과 삽입 속도를 제공합니다.
  • TreeMap: 정렬된 순서로 Key-Value를 저장하며, Red-Black Tree로 구현되어 있어 순서가 중요한 경우에 유리합니다.
  • LinkedHashMap: 입력 순서를 유지하는 특징이 있어, 순서가 중요한 데이터를 다룰 때 사용됩니다.
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.TreeMap;

public class MapTypesExample {
    public static void main(String[] args) {
        // HashMap
        Map<String, String> hashMap = new HashMap<>();
        hashMap.put("a", "Apple");
        hashMap.put("b", "Banana");
        System.out.println("HashMap: " + hashMap);

        // TreeMap
        Map<String, String> treeMap = new TreeMap<>();
        treeMap.put("c", "Cherry");
        treeMap.put("a", "Apple");
        System.out.println("TreeMap: " + treeMap);

        // LinkedHashMap
        Map<String, String> linkedHashMap = new LinkedHashMap<>();
        linkedHashMap.put("d", "Date");
        linkedHashMap.put("c", "Cherry");
        System.out.println("LinkedHashMap: " + linkedHashMap);
    }
}

Map의 장점과 사용 사례

Map은 키로 값을 빠르게 검색할 수 있어 데이터 조회가 자주 필요한 경우 성능이 뛰어납니다. 예를 들어 전화번호부와 같은 이름-번호 구조나 학생 성적과 같은 ID-점수 데이터를 다룰 때 유용합니다. 또한, 중복된 값을 허용하지만 Key는 고유해야 하므로, 고유한 키를 필요로 하는 애플리케이션에서 필수적입니다.

사용 사례

  1. 전화번호부 관리: 이름을 통해 전화번호를 빠르게 조회할 수 있습니다.
  2. 캐시 데이터 관리: 해시를 기반으로 빠르게 접근할 수 있는 HashMap을 통해 데이터 캐싱 시스템 구현이 가능합니다.
  3. 웹 애플리케이션의 세션 관리: 사용자 ID와 세션 데이터를 키-값 형태로 저장해 관리합니다.
import java.util.HashMap;
import java.util.Map;

public class PhoneBook {
    private Map<String, String> phoneBook = new HashMap<>();

    public void addContact(String name, String phoneNumber) {
        phoneBook.put(name, phoneNumber);
    }

    public String getPhoneNumber(String name) {
        return phoneBook.get(name);
    }

    public static void main(String[] args) {
        PhoneBook phoneBook = new PhoneBook();
        phoneBook.addContact("Alice", "123-456-7890");
        phoneBook.addContact("Bob", "987-654-3210");

        System.out.println("Alice's Phone Number: " + phoneBook.getPhoneNumber("Alice"));
    }
}

다양한 Map 예제

특정 조건에 맞는 키-값 쌍 필터링

Map은 스트림을 활용해 특정 조건에 맞는 데이터를 쉽게 필터링할 수 있습니다.

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class MapFilterExample {
    public static void main(String[] args) {
        Map<String, Integer> ages = new HashMap<>();
        ages.put("Alice", 23);
        ages.put("Bob", 20);
        ages.put("Charlie", 22);

        Map<String, Integer> filteredMap = ages.entrySet().stream()
            .filter(entry -> entry.getValue() > 21)
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

        System.out.println("Filtered Map: " + filteredMap);
    }
}

값 업데이트 및 기본 값 제공

import java.util.HashMap;
import java.util.Map;

public class MapDefaultExample {
    public static void main(String[] args) {
        Map<String, Integer> scores = new HashMap<>();
        scores.put("Alice", 85);

        int bobScore = scores.getOrDefault("Bob", 70);
        System.out.println("Bob's Score (default 70): " + bobScore);
    }
}

Map의 요소를 모두 출력하기

import java.util.HashMap;
import java.util.Map;

public class MapPrintExample {
    public static void main(String[] args) {
        Map<String, Integer> scores = new HashMap<>();
        scores.put("Alice", 95);
        scores.put("Bob", 80);

        for (Map.Entry<String, Integer> entry : scores.entrySet()) {
            System.out.println("Student: " + entry.getKey() + ", Score: " + entry.getValue());
        }
    }
}

참고사이트

반응형