Hun's Blog

[JAVA] MAP의 자료구조 본문

Language/Kotlin & Java

[JAVA] MAP의 자료구조

jhk-im 2020. 3. 21. 23:14

MAP



맵은 사전과 비슷하다.
people이란 단어에 "사람", baseball이란 단어에 "야구"라는 뜻이 부합되듯이 Map은 Key와 Value라는 것을 한 쌍으로 갖는 자료형이다. 맵은 리스트나 배열처럼 순차적으로 해당 요소 값을 구하지 않고 Key를 통해 Value를 얻는다.

*맵의 가장 큰 특징은 Key로 Value를 얻어낸다는 것이다. People이라는 단어의 뜻을 찾기 위해서 사전의 내용을 순차적으로 검색하는 것이 아니라 해당 단어가 있는 곳만을 펼쳐 보는 것이다.

*맵도 리스트와 마찬가지로 인터페이스다. 맵 인터페이스를 구현한 Map자료형에 HashMap, LinkedHashMap, TreeMap등이 있다.


HashMap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//put()
HashMap<StringString> map = new HashMap<StringString>();
map.put("people","사람");
map.put("baseball","야구");
key와 value가 String 형태인 HashMap 타입의 map을 만든다.
 
//get()
System.out.println(map.get("people")); // 사람
System.out.println(map.get("baseball")); // 야구
value를 얻기위해서는 get() 메소드 안에 key값을 입력하면된다.
 
//constainsKey()
System.out.println(map.containsKey("people")); // true
System.out.println(map.containsKey("baseball")); // true
System.out.println(map.containsKey("soccer")); // false
//constainsValue()
System.out.println(map.containsValue("사람")); // true
System.out.println(map.containsValue("야구")); // true
System.out.println(map.containsValue("축구")); // false
//containsKey(), constainsValue()는 메소드에 입력한 key나 value가 있는지 확인하여 boolean값을 반환한다.
 
//remove()
System.out.println(map.remove("people")); // 사람
System.out.println(map.containsValue("people")); // false
System.out.println(map.remove("야구")); // null
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

remove() 메소드에 key나 key,vlaue를 입력하면 해당 아이템이 map에서 삭제된다.
삭제될 때 해당 아이템의 value가 리턴된다.
value만을 입력해서 삭제하는 것은 안된다.

 

size()
System.out.println(map.size()); // 1현재 Map의 갯수를 리턴한다.

*맵의 가장 큰 특징은 순서에 의존하지 않고 key로 value를 가져오는데 있다.
HashMap은 데이터 정렬이 없다. key를 기준으로 정렬할 필요성이 있다면 유용하게 사용할 수 있는것이 TreeMap 클래스이다.

 

 

TreeMap


정렬기준
숫자 -> 알파벳 대문자 -> 알파벳 소문자 -> 한글

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//put()
TreeMap<StringString> treeMap = new TreeMap<StringString>();
treeMap.put("a","A");
treeMap.put("b","B");
treeMap.put("c","C");
treeMap.put("가","ㄱ");
treeMap.put("나","ㄴ");
treeMap.put("1","one");
treeMap.put("2","one");
treeMap.put("A","a");
treeMap.put("B","b");
put()은 HashMap과 동일하다.
 
// {1=one, 2=two, A=a, B=b, a=A, b=B, c=C, 가=ㄱ, 나=ㄴ}
System.out.println(treeMap);
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

출력 결과를 보면 put()메소드로 입력할 때 정렬기준에 맞추지 않고 뒤죽박죽 입력하였지만 출력 시에는 정렬기준에 맞춰서 출력되는 것을 확인할 수 있다.

*TreeMap은 순서가 중요한 클래스이므로 순서에 관련된 메소드들이 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//firstKey(), firstEntry()
System.out.println(treeMap.firstKey()); // 1
System.out.println(treeMap.firstEntry()); // 1=one
//firstKey() 메소드는 TreeMap의 정렬기준 가장 첫번째 key를 반환한다.
//firstEntry() 메소드는 key=value의 형태로 반환한다.
 
//lastKey(), lastEntry()
System.out.println(treeMap.lastKey()); // 나
System.out.println(treeMap.lastEntry()); // 나=ㄴ
//lastKey() 메소드는 TreeMap의 정렬기준 가장 마지막 key를 반환한다.
//lastEntry() 메소드는 key=value의 형태로 반환한다.
 
//higherKey(),higerEntry()
System.out.println(treeMap.higherKey("A")); // B
System.out.println(treeMap.higherEntry("A")); // B=b
//higherKey()메소드는 입력한 key의 순서보다 뒤에있는 key를 반환한다.
//higherEntry() 는 key=value 형태로 반환
 
//lowerKey(),lowerEntry()
System.out.println(treeMap.lowerKey("A")); // 2
System.out.println(treeMap.lowerEntry("A")); // 2=two
 

lowerKey()메소드는 입력한 key의 순서보다 앞에있는 key를 반환한다.
lowerEntry() 는 key=value 형태로 반환

*TreeMap은 정렬기준이 있다.
LinkedHashMap은 입력된 순서대로 데이터가 출력되는 특징을 가지고 있다.

 

 


LinkedHashMap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//put()
LinkedHashMap<StringString> linkedMap = new LinkedHashMap<StringString>();
linkedMap.put("가","ㄱ");
linkedMap.put("나","ㄴ");
linkedMap.put("1","one");
linkedMap.put("2","two");
//TreeMap과 동일한 순서대로 key와 value 를 입력하고 출력해보자.
 
//{a=A, b=B, c=C, 가=ㄱ, 나=ㄴ, 1=one, 2=two, A=a, B=b}
System.out.println(linkedMap);
//TreeMap과 다르게 입력된 순서 그대로 출력하는 것을 확인할 수 있다.
 
//HashMap과 비교해보자.
map.put("a","A");
map.put("b","B");
map.put("c","C");
map.put("가","ㄱ");
map.put("나","ㄴ");
map.put("1","one");
map.put("2","two");
map.put("A","a");
map.put("B","b");
// {가=ㄱ, a=A, 1=one, A=a, b=B, 2=two, B=b, c=C, 나=ㄴ}
System.out.println(map);
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

출력결과를 보면 정렬기준도 없고 입력순서대로 정렬되지도 않았다.



정리 - 
Map은 key와 value로 데이터를 저장하고 꺼내는 자료구조이다. 리스트와 배열과는 다르게 순차적으로 데이터를 다루지 않는다. 

전에 살펴보던 ArrayList 장점을 생각해보면 각가의 아이템에 index가 있고 해당 index를 이용해 다이렉트로 데이터에 접근할 수 있다는 것이었는다. 그리고 index를 관리하기 위해 데이터의 추가/삭제가 있을때 자동으로 index를 관리해 주었다. 

Map 을 보면서 느낀점은 List의 데이터 접근의 장점만 뽑아내서 구현한것이 아닐까 하는 생각이 들었고 List에서 데이터 변경시 순서보장을 위해 index가 바뀐다는 단점이 있기 때문에 순서보장을 제거한 것이 아닌가 하는 주관적인 생각을 하게되었다. 이부분은 조금 더 알아볼 필요가 있을 것 같다. 

어쨋든 이러한 특성을 가지고 있는 Map은 List 처럼 인터페이스이며 Map 인터페이스를 구현한 자료형중 가장 기본적인 것이 HashMap이다. 

HashMap은 Map의 특성을 그대로 구현해놨다는 느낌을 받았다. 순서보장없이 key와 value로 데이터를 저장하고 가져오는 작업을 도와준다. 

*프로그래밍 시 Map을 사용할 때 순서보장이 필요할 때가 있다. 라는 이야기가 있었고 2가지의 대표적인 방법이 있엇다.

1. 정렬기준에 맞춰서 데이터 순서를 보장한다. 
숫자 -> 알파벳 대문자 -> 알파벳 소문자 - > 한글 

2. 입력순서대로 데이터의 순서를 보장한다. 

1번에 해당하는 자료형은 TreeMap 이다. 정렬기준을 가지고 있으며 put() 메소드로 입력되는 key와 value 는 정렬기준에 의해 자동으로 정렬되기 때문에 순서를 보장해준다. tree라는 이름이 붙은것 처럼 정해진 정렬기준에 맞추어 데이터를 관리할 수 있다는 장점이 있다. 

2번에 해당하는 자료형은 LinkedHashMap 이다.  데이터를 입력된 순서대로 관리해서 데이터의 순서를 보장해 준다. 

리스트와는 다르게 각각의 특징들이 눈으로 잘 구분되어서 그런지 이해가 좀 더 수월했던 것 같다. 하지만 내부에서 정확히 어떻게 동작하는지에 대해서는 아직 자세하게 들어같다는 느낌은 받지 못했다. 그건 리스트도 마찬가지인가..?

어쨋든 매번 똑같은 결과인데 ... 이정도에서 멈추고 다음 기회에 더 깊이 알아보도록 하자.


https://wikidocs.net/208
https://onsil-thegreenhouse.github.io/programming/java/2018/02/22/java_tutorial_1-24/

 

[Java] 자바의 자료구조 - Map(HashMap, TreeMap) - Onsil's blog

초짜 개발자 온실의
스터디 블로그

onsil-thegreenhouse.github.io

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net