본문 바로가기

JAVA

Map 컬렉션

반응형

Map 컬렉션은 키(key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있습니다. 여기서 키와 값은 모두 객체입니다. 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있습니다. 만약에 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치됩니다.

Map 컬렉션에는 HashMap, HashTable, LinkedHashMap, Properties, TreeMap 등이 있습니다. 다음은 Map 컬렉션에서 공통적으로 사용 가능한 Map 인터페이스의 메소드들입니다.

기능 메소드 설명
객체 추가 V put(K key, V value) 주어진 키와 값을 추가, 저장되면 값을 리턴
객체 검색 boolean containsKey(Object key) 주어진 키가 있는지 여부
boolean containsValue(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를 삭제하고 값을 리턴

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

Map<String, Integer> map = ~;
map.put("홍길동", 30);
int score = map.get("홍길동");
map.remove("홍길동");

 

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

① keySet() 메소드로 모든 키를 Set 컬렉션으로 얻은 다음, 반복자를 통해 키를 하나씩 얻고 get() 메소드를 통해 값을 얻으면 됩니다.

Map<K, V> map = ~;
Set<K> keySet = map.keySet();
Iterator<K> keyIterator = ketSet.iterator();
while(keyIterator.hasNext()){
	K key = keyIterator.next();
    V value = map.get(key);
}

 

② entrySet() 메소드로 모든 Map.Entry를 set 컬렉션으로 얻은 다음, 반복자를 통해 Map.Entry 를 하나씩 얻고 getKey() 와 getValue() 메소드를 이용해 키와 값을 얻으면 됩니다.

Set<Map.Entry<K, V>> entrySet = map.entrySet();
Iterator<Map.Entry<K, V>> entryIterator = entrySet.iterator();
while(entryIterator.hasNext()) {
	map.Entry<K, V> entry = entryIterator.next();
    K key = entry.getKey();
    V value = entry.getValue();
}

 

1. HashMap

HashMap 은 Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다. HashMap의 키로 사용할 객체는 hashCode() 와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야 합니다. 동등 객체, 즉 동일한 키가 될 조건은 hashCode()의 리턴값이 같아야 하고, equals() 메소드가 true를 리턴해야 합니다. 다음 예제는 이름을 키로, 점수를 값으로 저장하는 HashMap 사용 방법을 보여줍니다.

import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.Iterator;

public class HasMapExample1 {

	public static void main(String[] args) {
		Map<String, Integer> map = new HashMap<String, Integer>();
		
		map.put("ABC", 85);
		map.put("DEF", 90);
		map.put("GHI", 80);
		map.put("DEF", 95);		// DEF 키가 같기 대문에 제일 마지막 저장한 값으로 대치
		System.out.println("총 Entry 수 : " + map.size());
		
		System.out.println("\tDEF : " + map.get("DEF"));
		System.out.println();
		
		Set<String> keySet = map.keySet();
		Iterator<String> keyIterator = keySet.iterator();
		while(keyIterator.hasNext()) {
			String key = keyIterator.next();
			Integer value = map.get(key);
			System.out.println("\t" + key + " : " + value);
		}
		System.out.println();
		
		map.remove("DEF");
		System.out.println("총 Entry 수 : " + map.size());
		
		Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
		Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
		
		while(entryIterator.hasNext()) {
			Map.Entry<String, Integer> entry = entryIterator.next();
			String key = entry.getKey();
			Integer value = entry.getValue();
			System.out.println("\t" + key + " : " + value);
		}
		System.out.println();
		
		map.clear();
		System.out.println("총 Entry 수 : " + map.size());
	}

}

 

2. Hashtable

Hashtable은 HashMap과 동일한 내부구조를 가지고 있습니다. Hashtable도 키로 사용할 객체는 HashCode() 와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야 합니다. HashMap과의 차이점은 Hashtable은 동기화된(synchronized) 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 이 메소드들을 실행할 수는 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있습니다. 그래서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있습니다. 다음은 키보드로 아이디와 비밀번호를 입력받아서, Hashtable에 저장되어 있는 키(아이디)와 값(비밀번호)으로 비교한 후 로그인 여부를 출력하는 예제입니다.

import java.util.Map;
import java.util.Hashtable;
import java.util.Scanner;

public class HashTableExample {

	public static void main(String[] args) {
		Map<String, String> map = new Hashtable<String, String>();
		
		map.put("spring", "12");
		map.put("summer", "123");
		map.put("fall", "1234");
		map.put("winter", "12345");
		
		Scanner scanner = new Scanner(System.in);
		
		while(true) {
			System.out.println("아이디와 비밀번호를 입력해주세요.");
			System.out.print("아이디 : ");
			String id = scanner.nextLine();
			
			System.out.print("비밀번호 : ");
			String password = scanner.nextLine();
			System.out.println();
			
			if(map.containsKey(id)) {
				if(map.get(id).equals(password)) {
					System.out.println("로그인 되었습니다.");
					break;
				} else {
					System.out.println("비밀번호가 일치하지 않습니다.");
				}
			} else {
				System.out.println("입력하신 아이디가 존재하지 않습니다.");
			}
		}
	}

}
반응형

'JAVA' 카테고리의 다른 글

모듈 기술자 (Java 11 버전 이후)  (3) 2019.12.18
"HashMap"의 "Value" 기준 정렬  (0) 2019.08.27
Set 컬렉션  (0) 2019.05.22
List 컬렉션  (0) 2019.05.22
자주쓰는 Eclipse 단축키 모음  (0) 2019.05.02