[자바/심화] 컬렉션 프레임워크 (2/2)

컬렉션 프레임워크 (Collection Framework)

- 여러 가지 자료 구조(Data Structure)를 쉽게 사용할 수 있도록 자바에서 미리 구현하여 제공하는 클래스를 말한다.

- 대표적인 인터페이스로는 List 인터페이스, Set 인터페이스, Map 인터페이스 등이 있다.

 

Map 계열 클래스

[Map 계열 클래스의 계층 구조]
[Map 계열 클래스의 계층 구조]

- 키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합이며, 이를 엔트리(entry)라고 한다. 

- 키는 중복을 허용하지 않으며, 하나의 키는 하나의 값과 연결된다.

- key를 이용하여 저장한 값을 얻을 수 있다.

- 대표적인 클래스로는 HashMap 클래스와 TreeMap 클래스 등이 있다.

 

Map 인터페이스에 선언되어 있는 주요 메소드들

- 모든 Map 인터페이스를 상속하는 Map 구현 클래스에 공통적으로 존재하는 주요 메소드이다.

추상 메소드 설명
  V put(K key, V value)   특정 키와 값을 매칭하여 추가하거나 갱신한다.
  V get(Object key)   지정한 키에 해당하는 값을 리턴하며, 키가 존재하지 않으면 null을 리턴한다.
  V remove(Object key)   지정된 키와 매핑된 값을 제거하고, 값을 리턴한다.
  boolean containsKey(Object key)   지정된 키가 맵에 있는 지 여부를 리턴한다.
  boolean containsValue(Object value)   지정된 값이 맵에 있는 지 여부를 리턴한다.
  Set<K> keySet()   맵에 있는 모든 키를 Set 타입으로 리턴한다.
  Collection<V> values()   맵에 있는 모든 값을 Collection 타입으로 리턴한다.
  Set<Map.Entry<K,V>> entrySet()   맵에 있는 모든 키와 값 쌍을 포함하는 Set 타입을 리턴한다.
  boolean isEmpty()   맵에 객체가 존재하지 않는 지 판별한다.
  default V replace(K key, V Value)   지정된 키에 해당하는 값을 매개변수의 값으로 변경하고, 이전 값을 리턴한다.
  default boolean replace(K key, V oldValue, V newValue)   지정된 키의 현재 값과 변경될 값을 매개변수로 전달하며, 변경에 성공하면 true를 리턴한다.
  void clear()   맵에 저장된 모든 객체를 제거한다.

[JavaDoc에서 보기]

HashMap 클래스

- Map 계열에서 가장 많이 사용되는 컬레션이다.

- 객체를 (key, value) 쌍으로 저장하며 key를 이용해서 value에 접근한다.

- HashMap에 저장된 객체 중 "key = value" 형태의 데이터를 엔트리(entry)라고 한다.

- HashMap 클래스 기능 구현 예시

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

public class HashMapExample {
    public static void main(String[] args) {
        // HashMap 객체 생성
        Map<String, Integer> studentScores = new HashMap<>();

        // 데이터 추가
        studentScores.put("홍길동", 85);
        studentScores.put("고길동", 90);
        studentScores.put("이지함", 95);
        studentScores.put("안중근", 80);

        // 데이터 조회
        System.out.println("홍길동's score: " + studentScores.get("홍길동"));    // 출력: 홍길동's score: 85
        System.out.println("이지함's score: " + studentScores.get("이지함"));    // 출력: 이지함's score: 95

        // 데이터 수정
        studentScores.put("홍길동", 88);  // 홍길동의 점수를 85에서 88로 수정

        // 데이터 삭제
        studentScores.remove("고길동");   // 고길동 데이터 제거

        // 모든 학생과 점수 출력
        System.out.println("Current student scores:");
        for (Map.Entry<String, Integer> entry : studentScores.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }

        // 특정 학생의 점수가 존재하는지 확인
        String student = "이순신";
        if (studentScores.containsKey(student)) {
            System.out.println(student + "'s score is " + studentScores.get(student));
        } else {
            System.out.println(student + "'s score is not recorded.");
        }
    }
}

TreeMap 클래스

- SortedMap 인터페이스를 구현하고 있는 클래스이다.

- HashMap과는 다르게 엔트리 저장 시 key가 오름차순으로 정렬되어 저장된다는 특징이 있다.

- 주요 메소드

주요 메소드 설명
  K firstKey()   첫 번째(가장 작은) key를 리턴한다.
  K lastKey()   마지막(가장 높은) key를 리턴한다.
  K ceilingKey(K key)   지정된 키보다 크거나 같은 키들 중에서 가장 작은 키를 리턴하며 존재하지 않으면 null을 반환한다.
  K lowerKey(K key)   지정된 키보다 작은 키들 중에 가장 큰 키를 리턴한다.
  SortedMap<K,V> headMap(K toKey, boolean inclusive)   inclusive가 false인 경우, toKey보다 작은 키를 가지는 키들을 정렬한 후 리턴하고 true인 경우, toKey를 포함한 작은 키를 가지는 키들을 정렬한 후 리턴한다.
  SortedMap<K,V> tailMap(K fromKey, boolean inclusive)   inclusive가 false인 경우, fromKey보다 크거나 같은 키들을 리턴하고 true인 경우, fromKey보다 큰 키를 가지는 키들을 리턴한다.
  SortedMap<K,V> subMap(K fromKey, K toKey)   fromKey와 toKey 사이의 키 값을 가지는 키들을 리턴한다.
  Map.Entry<K,V> firstEntry()   가장 작은 키 값을 가지는 엔트리를 리턴한다.
  Map.Entry<K,V> lastEntry()   가장 높은 키 값을 가지는 엔트리를 리턴한다.
  Set<K> keySet()   키들을 정렬된 Set으로 리턴한다.
  NavigableSet<K> descendingKeySet()   키들을 역순으로 된 NavigableSet으로 리턴한다.
  NavigableMap<K,V> descendingMap()   맵의 객체를 역순으로 된 NavigableMap으로 리턴한다.

[JavaDoc에서 보기]

- TreeMap 클래스 기능 구현 예시

import java.util.Map;
import java.util.TreeMap;

public class TreeMapExample {
    public static void main(String[] args) {
        // TreeMap 객체 생성
        TreeMap<Integer, String> treeMap = new TreeMap<>();

        // 데이터 추가
        treeMap.put(3, "Three");
        treeMap.put(1, "One");
        treeMap.put(2, "Two");
        treeMap.put(4, "Four");

        // 데이터 조회
        System.out.println("TreeMap contents:");
        for (Map.Entry<Integer, String> entry : treeMap.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }

        // 데이터 수정 (기존 값 덮어쓰기)
        treeMap.put(2, "New Two");

        // 데이터 삭제
        treeMap.remove(3);

        // 수정된 데이터 출력
        System.out.println("TreeMap contents after modification:");
        for (Map.Entry<Integer, String> entry : treeMap.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }

        // 특정 키의 값 조회
        int key = 4;
        if (treeMap.containsKey(key)) {
            String value = treeMap.get(key);
            System.out.println("Value for key " + key + ": " + value);
        } else {
            System.out.println("Key " + key + " not found.");
        }
    }
}

⊙ 참고 문헌

  1. 이병승, 「초보 개발자를 위한 자바:한 권으로 배우는 자바 마스터 가이드 북」, 영진닷컴, 2024, p730 - 738
  2. 이병승, 「초보 개발자를 위한 자바:한 권으로 배우는 자바 마스터 가이드 북」, 영진닷컴, 2024, p773 - 774
  3. 마종현, 「제로베이스 백엔드 취업 파트타임 스쿨 5기:Part 01. Java 기초-Chapter 01. Java 프로그래밍-15. 컬렉션 프레임워크」, 제로베이스, 2024, https://zero-base.co.kr/ 
  4. Java™ Platform, Standard Edition 8 API Specification, 2024.07.23, JavaDoc