본문 바로가기
JAVA

Map 컬렉션

by 요리하다그만둠 2022. 5. 31.

Map 컬렉션은 키 와 값으로 구성된 entry 객체를 저장하는 구조를 가지고 있다. 여기서 키와 값은 모두 객체이다. 키는 중복 저장될 수 없지만 값은 중복 저장이 가능하다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체하게 된다.

 

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

기능 메소드 설명  
객체추가 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> ketSet() 모든 키를 Set객체에 담아서 리턴
int size() 저장된 키의 총 수를 리턴
Collection<V> values() 저장된 모든 값을 Collection에 담아서 리턴 
객체 삭제 void clear() 모든 Map.Entry(키와 값)를 삭제
V remove(Object ket) 주어진 키와 일치하는Map.Entry를 삭제하고 값을 리턴

위 표의 메서드의 매개 변수 타입과 리턴 타입에 K, V라는 타입 파라미터가 있는데 이것은 Map 인터페이스가 제네릭 타입이기 때문입니다.

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

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

키를 알고 있다면 get() 메소드로 간단하게 객체를 찾아오면 되지만 저장된 전체 객체를 대상으로 하나씩 얻고 싶을 경우에는 두 가지  방법을 사용할 수 있습니다. 첫 번째는 ketSet() 메서드로 모든 키를 Set 컬렉션으로 얻은 다음 반복자를 통해 키를 하나씩 얻고 get() 메서드를 통해 값을 얻는 것입니다.

Map<k, V> map = ~;
Set<k> KeySet = map.KeySet();
Iterator<k> ketIterator = KeySet.iterator();
while(KeyIterator.hasNext()) {
	K key = KeyIterator.next();
    V value = map.get(Key);
	}

2번째 방법은 entrySet() 메소드로 모든 Map.Entry를 Set 컬렉션으로 얻은 후 반복자를 통해 Map.Entry를 하나씩 얻고 getKet()와 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 ket = entry.getKet();
    V value = entry.getValue();

HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다.

HashMap의 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야 하는데 동등 객체, 즉 동일한 키가 될 조건은 hashCode()의 리턴 값이 같아야 하고 equlas() 메서드가 true를 리턴을 해줘야 합니다.

HashMap을 생성하기 위해서는 키타입과 값 타입을 파라미터로 주고 기본 생성자를 호출하면 됩니다.

	Map<K, V> map = new HashMap<K, V>();
K-키 타입 V- 값 타입		K-키 타입 V- 값 타입

키와 값의 타입은 기본 타입(byte, short, int, float, double, boolean, char)을 사용할 수 없고 클래스 및 인터페이스 타입만 가능합니다. 키로 String 타입을 사용하고 값으로 Integer 타입을 사용하는 HashMap은 다음과 같이 생성할 수 있습니다.

Map<String, Integer> map = new HashMap<String, Integer>();

이름을 키로 점수를 값으로 저장하는 예제를 써보겠습니다.

package Ex00;

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

public class HashMapEx {

	public static void main(String[] args) {
		
        // Map 컬렉션 생성
        Map<String, Integer> map = new HashMap<String, Integer>();
		// String - Key 	Integer - Value
        // 키중심으로 오름차순 정렬
		// NavigableMap<String, String> map = new TreeMap<>();
		
		// 객체 저장
		map.put("홍길동", 85);
		map.put("홍길순", 75);
		map.put("홍길조", 95);
		map.put("홍길바닥", 45);
		map.put("홍길동", 55); 
		// "홍길동" 키가 같기 떄문에 제일 마지막에 저장한 값으로 저장된다.
		System.out.println("총 Entry수 : " + map.size());
		// 총 Entry수 : 4 출력
		
		// 객체 찾기
		System.out.println("\t홍길동 : " + map.get("홍길동"));
		// 이름(키)으로 정수(값)을 검색한다.
		System.out.println();
		// 	홍길동 : 55 출력
		
		
		// 객체를 하나씩 처리
		Set<String> KeySet = map.keySet();
		
		// for(String s : KeySet) {
		//  System.out.println(s + " ");
		// } -- 이름만 나옴
		
		// Key Set 얻기
		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();
		// 홍길바닥:45 / 홍길동:55 / 홍길순:75 / 홍길조:95 출력된다.
		
		// 객체 삭제
		map.remove("홍길동");
		System.out.println("총 Entry 수 : " + map.size());
		// 총 Entry 수 : 3 출력
		
		// 객체를 하나씩 처리
		Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
		// Map.Entry Set얻기
		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);
		}
		// 홍길바닥:45 / 홍길순:75 / 홍길조:95 출력됨 홍길동은 위에서 지워서 없음
		System.out.println();
		
		// 객체 전체 삭제
		map.clear(); // 모든 Map.Entry삭제
		System.out.println("총 Entry 수 : " + map.size());
		// 총 Entry 수 : 0 출력
        
        // forEach문을 이용 모두 같은방법
		// map.entrySet().forEach(System.out::print);
		// map.entrySet().forEach(k -> System.out.print(k + " "));
		map.keySet().forEach(k->System.out.println(k+"="+map.get(k)));
        // key 들만 나열
		map.keySet().forEach(System.out::println);
		
		// value 들만 나열
		map.values().forEach(System.out::println);
	}
	

}

전체 나열 결과는 동일함

'JAVA' 카테고리의 다른 글

Stream  (0) 2022.06.03
멀티 스레드  (0) 2022.06.02
컬렉션 프레임워크 Set 컬렉션  (0) 2022.05.30
컬렉션 프레임워크 LinkedList  (0) 2022.05.30
컬렉션 프레임워크 Vector  (0) 2022.05.30