map은 사원번호나 학번처럼 고유한 구분자인 "key로 데이터(value)를 구분" 하는 기능을 가지고 있는 자료형이다.
value는 동일한 데이터 저장이 가능하지만, key는 중복 데이터를 허용하지 않는다.
map 자료형중 하나로 Hashmap과 HashTable이 있다.
문법 : HashMap<key, value> //Hashtable도 동일
HashMap<String, String> map = new HashMap<>();
HashMap<String, String> map = new HashMap<String, String>();
Hashmap과 Hashtable도 제네릭을 사용한다.
value를 추가하고 싶을 때는 put을 이용할 수 있다.
HashMap<String, String> map = new HashMap<String, String>();
map.put("첫번째", "1");
map.put("두번째", "2");
map.put("세번째", "3");
key를 이용해 특정 value를 가져오고 싶을 때는 get을 이용하면 된다.
"첫번째" key를 이용하여 1이 출력되게 해보자.
문법 : Hashmap변수명.get(key);
HashMap<String, String> map = new HashMap<String, String>();
map.put("첫번째", "1");
map.put("두번째", "2");
map.put("세번째", "3");
System.out.println(map.get("첫번째")); // 1 출력
key로 데이터( key, value 모두 )를 삭제하는 remove를 이용해서 "첫번째", "1"을 삭제해보자.
remove는 데이터를 삭제한 후 그 value값을 리턴하므로 출력문으로 확인해볼 수 있다.
System.out.println(map.remove("첫번째")); // "첫번째"와 "1" 모두 삭제
출력 : 1
map이 보유한 모든 key가 필요하다면, key 전부를 모아서 반환하는 keyset을 활용할 수 있다.
HashMap<String, String> map = new HashMap<String, String>();
map.put("첫번째", "1");
map.put("두번째", "2");
map.put("세번째", "3");
System.out.println(map.KeySet());
출력 : 첫번째, 두번째, 세번째
key 는 getKey( ) 로 활용이 가능하고, value 는 getValue ( )로 활용이 가능하다.
만약 key 뿐만 아니라 모든 value도 함께 가져와야 한다면 Map.Entry에 있는 entrySet을 이용하면 된다.
Map.Entry : key와 value값을 한쌍으로 보유하는 API
entrySet과 반목문을 활용하여 모든 데이터를 가져올 수 있다.
아래는 작성 예시이다.
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " - " + entry.getValue());
}
< 출력 >
첫번째-1
두번째-2
세번째-3
map이 보유한 데이터를 하나씩 순차적으로 반환하므로 반복문과 함께 사용해야하며 반복문 생략시 컴파일 오류가 발생했다.
둘은 서로 동일한 map 구조를 가지고 있는데, 차이점은 동기화 지원 여부이다.
Hashmap은 지원하지 않고 Hashtable은 동기화를 지원한다.
따라서 Hashtable은 멀티 스레드 환경에서 해당 메서드를 동시에 수행할 수 없기 때문에, 객체를 안전하게 추가/삭제 할 수 있다.
멀티 스레드 : 하나의 프로그램이 동시에 여러개의 일을 처리할 수 있도록 하는 것
따라서 실행 환경에 따라 Hashmap, Hashtable을 구분하여 사용할 수 있다.