Programming Language/JAVA

[JAVA] 컬렉션 프레임워크 3 - Map

Untitled_Blue 2023. 6. 5. 23:22
반응형

안녕하세요. 이번 글은 자바 컬렉션 프레임워크 종류 중 하나인 Map에 대한 설명입니다.

 

- Map<K, V>이란?

Map<K, V>이란 Key와 Value을 기반으로 사용하는 컬렉션을 의미한다. 여기서 Key값은 유일성을 지니는 요소이며 그만큼 중복성이 허용되지 않는다는 점이 특징이다. Value 값은 중복가능하다. 이 둘은 한 쌍으로 반드시 모두 존재해야 되며 절대 분리되는 개념으로 생각하면 안된다. 

- Map<K, V>와 관련된 핵심 메서드

메서드 설명
.put(K key, V value) Key와 Value 값을 객체에 추가
.putAll(Map<E> m) 다른 객체의 데이터를 자기 자신의 객체에 복사
.replace(K key, V value) Key에 해당되는 값을 Value값으로 변경
.replace(K key, V oldValue, V newValue) Key에 해당되는 값 중 oldValue -> newValue로 변경
.get(Object Key) Key값에 해당되는 Value 값 반환
.containsKey(Object Key) 객체 내 Key값이 있는지에 대한 여부 반환
.containsValue(Object value) 객체 내 Value값이 있는지에 대한 여부 반환
.keySet(), .entrySet() 객체에서 Key 또는 Entry들을 활용해서 객체로 반환
.size() 객체 내 데이터의 갯수 반환
.clear() 객체 내 모든 데이터 삭제
.remove(Object Key), .remove(Object key, Object value) Key값 또는 Key와 Value값에 해당되는 객체 내 데이터 삭제

상단의 표는 Map<K, V>와 관련된 전반적인 메서드이다. 대표적으로 HashMap을 활용해 실습 및 설명할 것이다.

- .put()

package classes;

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

public class CFrame_Map {
    public static void main (String[] args) {
        Map<Integer, String> map = new HashMap<Integer, String>();

        map.put(1, "One");
        map.put(2, "One");
        map.put(3, "One");
        map.put(4, "One");
        map.put(5, "One");

        System.out.println(map.toString()); // {1=One, 2=One, 3=One, 4=One, 5=One}

        map.put(6, "Two");
        map.put(7, "Three");
        map.put(8, "Four");
        map.put(9, "Five");

        System.out.println(map.toString()); // {1=One, 2=One, 3=One, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five}

        map.put(5, "One"); // KEY 값의 중복으로 인한 추가 불가능

        System.out.println(map.toString()); // {1=One, 2=One, 3=One, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five}
    }
}

다음 소스코드를 통해 .put()을 통해 객체 안에 데이터를 추가할 수 있음을 확인할 수 있다. 또한 Value값과 다르게 Key값은 중복될 수 없다는 점 또한 확인할 수 있다.

- .replace()

package classes;

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

public class CFrame_Map {
    public static void main (String[] args) {
        Map<Integer, String> map = new HashMap<Integer, String>();

        map.put(1, "One");
        map.put(2, "One");
        map.put(3, "One");
        map.put(4, "One");
        map.put(5, "One");
        map.put(6, "Two");
        map.put(7, "Three");
        map.put(8, "Four");
        map.put(9, "Five");

        map.replace(1, "Seven");
        System.out.println(map.toString()); // {1=Seven, 2=One, 3=One, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five}

        map.replace(3, "Ten");
        System.out.println(map.toString()); // {1=Seven, 2=One, 3=Ten, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five}
    }
}

상단의 소스코드를 통해 .replace()를 통해 Value 값을 변경할 수 있음을 확인가능하다. 이때 Key값을 기반으로 데이터를 찾을 수 있다는 점과 동시에 Map에서 List 인터페이스에서 인덱스와 같은 역할을 하기 때문에 Key값이 중복되면 안되는 이유 또한 확인할 수 있다.

- .get(), .containsKey(), .containsValue(), .keySet(), entrySet()

package classes;

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

public class CFrame_Map {
    public static void main (String[] args) {
        Map<Integer, String> map = new HashMap<Integer, String>();

        map.put(1, "One");
        map.put(2, "One");
        map.put(3, "One");
        map.put(4, "One");
        map.put(5, "One");
        map.put(6, "Two");
        map.put(7, "Three");
        map.put(8, "Four");
        map.put(9, "Five");

        System.out.println(map.get(7)); // true
        System.out.println(map.get(12)); // false

        System.out.println(map.containsKey(3)); // true
        System.out.println(map.containsKey(15)); // false

        System.out.println(map.containsValue("Four")); // true
        System.out.println(map.containsValue("Eleven")); // false

        System.out.println(map.keySet()); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
        System.out.println(map.entrySet()); // [1=One, 2=One, 3=One, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five]
    }
}

상단의 소스코드를 통해 .get()을 통해 Key값이 실제로 객체 안에 존재하는지에 대한 여부를 boolean형으로 반환받을 수 있음을 확인할 수 있다. 또한 .containsKey()와 .containsValue()를 통해 각각 Key와 Value값을 기반으로 객체 안에 존재하는지에 대한 여부를 boolean을 통해 true, false 둘 중 하나로 확인해볼 수 있다. 마지막으로 keySet()으로 객체 내에서 Key값만 모아서 조회할 수 있으며 entrySet()을 통해 각각의 엔트리들을 모아서 볼 수 있음을 확인할 수 있다.

- .remove(), .clear(), .size()

package classes;

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

public class CFrame_Map {
    public static void main (String[] args) {
        Map<Integer, String> map = new HashMap<Integer, String>();

        map.put(1, "One");
        map.put(2, "One");
        map.put(3, "One");
        map.put(4, "One");
        map.put(5, "One");
        map.put(6, "Two");
        map.put(7, "Three");
        map.put(8, "Four");
        map.put(9, "Five");

        System.out.println(map.size()); // 9
        System.out.println(map.toString()); // {1=One, 2=One, 3=One, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five}

        map.remove(1);
        System.out.println(map.size()); // 8
        System.out.println(map.toString()); // {2=One, 3=One, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five}

        map.clear();
        System.out.println(map.size()); // 0
        System.out.println(map.toString()); // {}
    }
}

상단의 소스코드를 통해 .remove()를 통해 객체 내 데이터를 key값을 기반으로 삭제 가능하다는 점을 확인할 수 있다. 또한 삭제가 제대로 됐음을 .size()와 .toString()을 통해서 검증할 수 있음을 확인 가능하다. 그리고 .clear()를 통해 객체 내 모든 데이터를 Key와 Value값 모두 전체 삭제했음을 앞에 언급한 두 개의 메서드를 통해 확인 및 검증할 수 있다.

- HashMap 말고도 다른 Map은 존재한다. LinkedHashMap<K, V>

LinkedHashMap<K, V>는 기존 HashMap<K, V>를 기반으로 제작된 클래스이며 기본적인 특성에 입력한 데이터의 순서에 대한 정보가 추가된 클래스다. 앞뒤로 Key의 정보가 서로 연결되어 있으며 사용하는 메서드는 HashMap<K, V>와 전체적으로 모두 일치하다. 여담으로 TreeMap<K, V>가 있는데 이는 트리구조를 기반으로 상하관계를 바탕으로 되어있으며 데이터를 Key 값의 크기 순으로 정렬하면서 관리한다는 점이 특징이다. 관련 메서드도 Key 값의 크기를 비교 및 대조하는 방식으로 되어있다.

 

다음 글은 제너릭에 대한 설명입니다. 감사합니다.

반응형