[자료구조]Map 인터페이스
보통 객체들을 저장하는데 key를 붙여서 저장하는 방식을 Map 인터페이스라고 합니다. Map 객체는 (key, value)의 쌍으로 저장합니다. 이러한 (key, value) 쌍인 객체는 Map.Entry 타입의 객체이며 key와 value는 모두 객체로 이루어져 있습니다. key는 중복이 불가능 하지만 value는 중복저장이 가능합니다. 이렇게 Map은 데이터를 찾아갈 수 있는 key와 실제 데이터인 value를 저장한다고 해서 Dictionary라고도 부릅니다. Map 인터페이스를 구현한 구현 클래스는 HashMap, Hashtable, TreeMap, LinkedHashMap 등이 있습니다.
HashMap은 key의 순서를 알 수 없고, TreeMap은 key의 순서가 크기 순이며 LinkedHashMap은 key의 순서가 저장된 순서입니다.
저장하고 싶은 데이터, 값이 value가 되고 이 값을 다시 가져오는 경우 필요한 것이 key입니다. 예를 들어 각 방에 값을 담아두고 열쇠로 잠궜을 때 다시 값을 가져오려면 열쇠가 필요합니다. 이 열쇠는 당연히 다른 방 열쇠와 겹치면 안 되며 유일한 키여야 합니다. 동일한 key에 데이터를 2번 이상 저장하면 두번째 부터는 데이터가 업데이트 됩니다.
○ Map 인터페이스의 주요 메서드
V put(K key, V value) - 키와 값으로 추가, 추가된 값으로 리턴
boolean containsKey(Object key) - 키가 존재하는지 여부
boolean containsValue(Object value) - 값이 존재하는지 여부
Set entrySet() - 키와 값의 모든 요소를 set으로 리턴
V get(Object key) - 키로 값을 가져옴
boolean isEmpty() - 비었는지 여부 확인
Set keySet() - 모든 키를 set객체로 리턴
int size() - 키의 수
Collection values() - 모든 값을 Collection으로 리턴
void clear() - 모든 키와 값 삭제
V remove(Object key) - 해당 키의 키와 값 삭제, 삭제된 값 리턴
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
|
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
// Map 객체 생성 - 제네릭을 해주면 훨씬 명확하다
Map<String, Integer> map = new HashMap();
// 이름이 담긴 문자열 배열 생성
String[] names = {"홍길동", "김유신", "을지문덕", "강감찬", "김유신"};
// 숫자가 담긴 정수 배열 생성
int[] nums = {1234, 4567, 2350, 9870, 2345};
// Map 객체에 두 배열의 값들을 키와 밸류 쌍으로 저장
for (int i = 0; i < names.length; i++) {
map.put(names[i], nums[i]);
}
// 출력
System.out.println(map);
System.out.println("홍길동 번호 : " + map.get("홍길동"));
System.out.println("을지문덕 번호 : " + map.get("을지문덕"));
System.out.println("김유신 번호 : " + map.get("김유신"));
}
}
|
cs |
[실행 결과]
{홍길동=1234, 김유신=2345, 을지문덕=2350, 강감찬=9870}
홍길동 번호 : 1234
을지문덕 번호 : 2350
김유신 번호 : 2345
key값으로 저장된 객체를 검색하기 위해서 사용하는 메서드가 map.get("홍길동")이며 "홍길동"을 key로 하는 value를 리턴해줍니다. 또한 key에 "김유신"이 중복 입력 되므로 김유신은 한 개만 저장됩니다. 두번째 "김유신"은 새로운 값으로 대체되기에 value는 기존 내용이 수정되어 2345로 출력된 것입니다. 다음 예제는 키값들만 조회하는 예제입니다.
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
30
31
32
33
34
35
36
37
38
39
40
|
package Example;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapEx2 {
public static void main(String[] args) {
// Map 객체 생성
Map<String, Integer> map = new HashMap();
// 이름이 담긴 문자열 배열 생성
String[] names = {"홍길동", "김유신", "이순신", "강감찬", "김유신"};
// 숫자가 담긴 정수 배열 생성
int[] nums = {1234, 4567, 2350, 9870, 2345};
// Map 객체에 두 배열의 값들을 key와 value 쌍으로 저장
for (int i = 0; i < names.length; i++) {
map.put(names[i], nums[i]);
}
// Map 객체에서 key 들만 조회하기
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key + "=" + map.get(key));
}
System.out.println("Iterator로 출력");
Iterator it = keys.iterator();
while (it.hasNext()) {
String a = (String)it.next();
System.out.println(a + "=" + map.get(a));
}
}
}
|
cs |
[실행 결과]
홍길동=1234
김유신=2345
강감찬=9870
이순신=2350
Iterator로 출력
홍길동=1234
김유신=2345
강감찬=9870
이순신=2350
Map 객체의 key 들만 조회하는 메서드는 keySet()입니다. Map 객체에서 key값은 중복될 수 없기에 Set 객체로 리턴해줍니다. 만약에 value 값들만 조회해주고 싶다면 values()라는 메서드를 호출해주면 됩니다.
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
30
31
32
33
34
35
36
37
38
39
40
|
package Example;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMap3 {
public static void main(String[] args) {
// Map 객체 생성
Map<String, Integer> map = new HashMap();
// 이름이 담긴 문자열 배열 생성
String[] names = {"홍길동", "김유신", "이순신", "강감찬", "김유신"};
// 숫자가 담긴 정수 배열 생성
int[] nums = {1234, 4567, 2350, 9870, 2345};
// Map 객체에 두 배열의 값들을 key와 value 쌍으로 저장
for (int i = 0; i < names.length; i++) {
map.put(names[i], nums[i]);
}
// Map 객체에서 value 들만 조회
Collection values = map.values();
for (Object i : values) {
System.out.println(i);
}
System.out.println("Iterator로 출력");
Iterator it = values.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
|
cs |
[실행결과]
1234
2345
9870
2350
Iterator로 출력
1234
2345
9870
2350
Map 인터페이스의 values() 메서드의 리턴 타입은 Set도 List도 아닌 Collection 타입으로 리턴합니다.
(value값들이 중복이 안된다는 보장도 없고, 저장된 순서를 유지하기도 어렵기 때문)
다음 예제는 (key, value) 쌍으로 이루어진 객체를 가져오는 예제입니다.
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
30
31
32
33
34
35
36
|
package Example;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HashMapEx4 {
public static void main(String[] args) {
// Map 객체 생성
Map<String, Integer> map = new HashMap<>();
// 이름이 담긴 문자열 배열 생성
String[] names = {"홍길동", "김유신", "이순신", "강감찬", "김유신"};
// 숫자가 담긴 정수 배열 생성
int[] nums = {1234, 4567, 2350, 9870, 2345};
// Map 객체에 두 배열의 값들을 key와 value 쌍으로 저장
for (int i = 0; i < names.length; i++) {
map.put(names[i], nums[i]);
}
// Map 객체는 (key, value) 쌍으로 이루어진 객체들의 모임
// (key, value) 쌍으로 조회
Set entry = map.entrySet();
for (Object o : entry) {
Map.Entry m = (Map.Entry)o;
System.out.println("key: " + m.getKey() + ", value: " + m.getValue());
}
}
}
|
cs |
[실행결과]
key: 홍길동, value: 1234
key: 김유신, value: 2345
key: 강감찬, value: 9870
key: 이순신, value: 2350
entrySet() 메서드는 키가 중복이 안 되므로 중복이 허용되지 않습니다. 그러므로 Set 객체로 리턴해줍니다.
key, value의 쌍인 객체의 자료형은 Map.Entry 형입니다.
'알고리즘 지식 > 자료구조' 카테고리의 다른 글
배열(Array) (1) | 2024.06.17 |
---|---|
[자료구조]문자열 (0) | 2023.01.02 |
[자료구조]버블 정렬 (0) | 2022.12.30 |
[자료구조]원형 큐 (0) | 2022.12.27 |
[자료구조]슬라이딩 윈도우 With 투 포인터 (0) | 2022.12.26 |
댓글
이 글 공유하기
다른 글
-
배열(Array)
배열(Array)
2024.06.17 -
[자료구조]문자열
[자료구조]문자열
2023.01.02 -
[자료구조]버블 정렬
[자료구조]버블 정렬
2022.12.30 -
[자료구조]원형 큐
[자료구조]원형 큐
2022.12.27