RATSENO

[JAVA]Map 컬렉션 본문

DEV/JAVA

[JAVA]Map 컬렉션

RATSENO 2020. 2. 5. 10:51

Map 컬렉션은 키(key) 값(value)으로 구성된 Entry 객체를  저장하는 구조를 가지고 있습니다.

여기서의 키와 값은 모두 객체입니다. 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있습니다.

만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치됩니다.

 

Map 컬렉션에는 HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있습니다.

다음은 Map 컬렉션에서 공통적으로 사용 가능한 Map 인터페이스의 메소드들입니다.

키로 객체들을 관리하기 때문에 키를 매개값으로 갖는 메소드가 많습니다.

기능 메소드 설명

객체 추가

V put(K key, V value) 주어진 키와 값을 추가, 저장되면 값을 리턴
객체 검색



boolean contains(Object key) 주어진 키가 있는지 여부
boolean contaionsValue(Object value) 주어진 값이 있는지 여부
Set<Map.Entry<K,V>> entrySet() 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set 담아 리턴
V get(Object key) 주어진 키가 있는 값을 리턴
boolean isEmpty() 컬렉션이 비어있는지 여부
Set<K> keySet() 모든 키를 Set 객체에 담아 리턴
int size() 저장된 키의 총 수를 리턴
Collection<V> values() 저장된 모든 값을 Collection에 담아서 리턴
void clear() 모든 Map.Entry(키와 값)를 삭제
V remove(Object key) 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴

위 표에서 메소드의 매개 변수 타입과 리턴 타입에 K와 V라는 타입 파라미터가 있는데, 이것은 Map 인터페이스가 

제네릭 타입이기 때문이다. 구체적인 타입은 구현 객체를 생성할 때 결정된다.

 

객체 추가는 put() 메소드를 사용하고, 키로 객체를 찾아올 때에는 get() 메소드를 사용한다. 그리고 객체 삭제는 remove()메소드를 사용한다.

Map<String, Integer> map = new HashMap<>();
map.put("홍길동", 30);         //객체 추가
int score = map.get("홍길동"); //객체 찾기
map.remove("홍길동");     //객체 삭제

여기서 Map<String,  Integer> map = new map<>() 이 아닌것에 의문을 가지는 분들도 계실것 같습니다.(저ㅠ....)

Map 컬렉션은 인터페이스입니다. 인터페이스란 추상메소드들로만 구성되어있는 기본 설계도 입니다.

이 인터페이스로는 객체를 생성할 수 없습니다. 그래서 Map 인터페이스를 구현한 구현 클래스를 이용하여 객체를 생성하여야 합니다.

추후에 포스팅할 내용은 HashMap은 Map인터페이스를 구현한(추상메서드들을 정의한) 구현체들 중의 하나 입니다.

 

만약 Map<String,  Integer> map = new map<>() 이런식으로 코딩을 해보시게되면

        Map<String, Integer> map = new Map<String, Integer>() {
            @Override
            public int size() {
                return 0;
            }

            @Override
            public boolean isEmpty() {
                return false;
            }

            @Override
            public boolean containsKey(Object key) {
                return false;
            }

            @Override
            public boolean containsValue(Object value) {
                return false;
            }

            @Override
            public Integer get(Object key) {
                return null;
            }

            @Override
            public Integer put(String key, Integer value) {
                return null;
            }

            @Override
            public Integer remove(Object key) {
                return null;
            }

            @Override
            public void putAll(Map<? extends String, ? extends Integer> m) {

            }

            @Override
            public void clear() {

            }

            @Override
            public Set<String> keySet() {
                return null;
            }

            @Override
            public Collection<Integer> values() {
                return null;
            }

            @Override
            public Set<Entry<String, Integer>> entrySet() {
                return null;
            }
        }

Map 인터페이스의 추상메서드들을 직접 구현 하시면 사용할 수야  있겠지만, 이미 강력한 기능들을 가진 구현체들이 있기 때문에

이러한 고생을 하실필요가 없습니다.

 

얘기가 길어졌습니다. 다시 본론으로 돌아와서 다음 예제를 보겠습니다.

키를 알고 있다면 get() 메소드로 간단하게 객체를 찾아오면 되지만, 저장된 전체 객체를 대상으로 하나씩 얻고 싶을 경우에는 두가지 방법이 있습니다.

첫 번째는 keySet() 메소드로 모든 키를 Set 컬렉션으로 얻은 다음, 반복자를 통해 키를 하나씩 얻고 get()메소드를 통해 값을 얻는것 입니다.

        Map<String, Integer> map = new HashMap<>();
        Set<String> keySet = map.keySet();
        Iterator<String> iterator = keySet.iterator();
        while (iterator.hasNext()){
            String key = iterator.next();
            Integer value = map.get(key);
        }

두 번째 방법은 entrySet() 메소드로 모든 Map.entry를 Set 컬렉션으로 얻은 다음, 반복자를 통해 Map.entry를 하나씩 얻고 getKey() 와 getValue() 

메소드를 이용해 키와 값을 얻으면 됩니다.

        Map<String, Integer> map = new HashMap<>();
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Integer> next = iterator.next();
            String key = next.getKey();
            Integer value = next.getValue();
        }

다음 포스팅에서는 Map 인터페이스의 구현체인 HashMap에 대해서 알아보겠습니다.

'DEV > JAVA' 카테고리의 다른 글

CompletableFuture<T> -1  (0) 2021.03.14
[JAVA]TreeSet  (0) 2020.02.05
[JAVA]Map 컬렉션 - HashMap  (0) 2020.02.05
[JAVA]인터페이스  (0) 2019.12.26
[JAVA]추상 클래스  (0) 2019.12.16
Comments