[자료구조, Java] Map 개념 및 활용

320x100

선행 내용

Map을 이해하시기 위해서는 Set에 대한 이해가 먼저 필요합니다.

Set/Map을 구현하기 위한 Hash/Tree에 대한 설명, Set 활용에 대해 정리한 이전 글을 참조해주시면 감사하겠습니다.

 

Set, Map 비교

Set은 값이 곧 저장 위치를 나타내는 자료구조입니다.

Set은 기능이 부실한 점이 보였습니다. 예를 들어, 중복 저장이 되지 않는 점, 값을 순서대로 출력할 수 없다는 점 등 부족한 기능이 있었고, 이를 보충하기 위한 방안으로 Set에 좋은 기능은 가져가되, 인덱스를 따로 둠으로써 해당 문제점들을 해결하기 위한 방안인 Map이 있습니다.

 

Set과 Map의 가장 큰 차이는

Set : 값이 곧 인덱스 (값을 해시 코드로 변환해 해당 위치에 저장)

Map : 값과 인덱스 구분 (인덱스를 해시 코드로 변환해 해당 위치에 값 저장)

 

그림으로 나타내자면, 다음과 같습니다.

Set

-저장

-조회

 

 

이번엔 Map의 저장 및 조회 방법입니다.

Map

- 저장

- 조회

 

EntrySet/KeySet

이전 Set에서는 Iterator를 이용해 저장된 자료를 출력했습니다.

Map에서도 Iterator를 통해 출력하는 방법도 있지만, 주로 EntrySet과 KeySet이라는 개념이 사용됩니다.

 

KeySet은 저장된 값들의 Key 모음이라고 생각하시면 됩니다. 다음은 KeySet을 이용해 전체 값을 출력하는 코드입니다.

int count = 1;
for(int key : hMap.keySet()) {
	System.out.println(count + "번째 KeySet : " + key + ", " + hMap.get(key));
}

 

EntrySet은 저장된 키와 값에 대한 정보를 모두 가지고 있고, 이들의 모음이라고 생각하시면 됩니다. 다음은 EntrySet을 이용해 전체 값을 출력하는 코드입니다.

int count = 1;
for(Map.Entry<Integer, String> mEntry : hMap.entrySet()) {
	System.out.println(count + "번째 EntrySet : " + mEntry.getKey() + ", " + mEntry.getValue());
}

 

HashSet 활용

package Set_Map.Map;

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

public class MapPractice {
	public static void main(String[] args) {
		// HashMap 선언 방법
		Map<Integer, String> hMap = new HashMap<Integer, String>(); // 자료형 지정 
		Map<Integer, String> hMap2 = new HashMap<>(); // 좌측 선언부만 자료형 지정
		Map<Integer, String> hMap3 = new HashMap<Integer, String>(20); // 용량 지정
		Map<Integer, String> hMap4 = new HashMap<Integer, String>() { 
			{put(1, "ab");}
			{put(2, "bc");}
		};// 용량 지정
		
		// 좌축 클래스를 HashMap으로 해도 Set과 동일
		HashMap<Integer, String> hMap5 = new HashMap<Integer, String>();
		HashMap<Integer, String> hMap6 = new HashMap<>();
		HashMap<Integer, String> hMap7 = new HashMap<Integer, String>(20);
		HashMap<Integer, String> hMap8 = new HashMap<Integer, String>() { 
			{put(1, "ab");}
			{put(2, "bc");}
		};
		
		// 값 추가
		hMap.put(3, "e");
		hMap.put(4, "c");
		hMap.put(5, "g");
		hMap.put(6, "f");
		hMap.put(7, "d");
		hMap.putAll(hMap4); // {1, "ab"}, {2, "bc"}가 들어있는 HashMap 추가
		
		System.out.println("-Contain Test");
		System.out.println("key '1' 포함 여부 : " + hMap.containsKey(1));
		System.out.println("'ab' 포함 여부 : " + hMap.containsValue("ab")); // 추가된 "ab" 포함 여부 출력
		System.out.println();
		
		// 출력 방법 1: EntrySet
		System.out.println("-Output Test");
		System.out.println("출력방법 1 : EntrySet 사용");
		int count1 = 1;
		for(Map.Entry<Integer, String> mEntry : hMap.entrySet()) {
			System.out.println(count1 + "번째 EntrySet : " + mEntry.getKey() + ", " + mEntry.getValue());
		}
		System.out.println("\n");
		
		// 출력방법 2 : KeySet
		System.out.println("출력방법 2 : KeySet 사용");
		int count2 = 1;
		for(int key : hMap.keySet()) {
			System.out.println(count2 + "번째 KeySet : " + key + ", " + hMap.get(key));
		}
		System.out.println("\n");
		
		// 출력방법 3 : EntrySet Iterator
		System.out.println("출력방법 3 : EntrySet Iterator 사용");
		Iterator<Map.Entry<Integer, String>> entryIter = hMap.entrySet().iterator();
		int count3 = 1;
		while(entryIter.hasNext()) {
			Map.Entry<Integer, String> entry = entryIter.next();
			System.out.println(count3 + "번째 EntrySet Iterator : " + entry.getKey() + ", " + entry.getValue());
		}
		System.out.println();
		
		// 출력 방법 4 : KeySet Iterator
		System.out.println("출력방법 4 : KeySet Iterator 사용");
		Iterator<Integer> keyIter = hMap.keySet().iterator();
		int count4 = 1;
		while(keyIter.hasNext()) {
			int key = keyIter.next();
			System.out.println(count4 + "번째 KeySet Iterator : " + key + ", " + hMap.get(key));
		}
		System.out.println();
	}
}
320x100