Map은 key-value를 하나의 쌍으로 묶어서 저장하는 자료구조.
다른 언어에서는 딕셔너리 dictionary라고 함. Map은 사전과 같은 자료 구조.
즉 사전처럼 단어가 있고(이것을 키 key 라고 부름), 단어에 대한 설명(이것을 값 value 라고 부름)이 있음.
하나가 아닌 쌍 pair으로 되어 있는 자료를 관리하는 메서드들이 선언되어 있음.
key-value 쌍이라고 표현하는데 이 때 key는 중복될 수없음. value는 중복 가능.
Map은 기본적으로 검색용 자료 구조.
즉 어떤 Key 값을 알고 있을 때 value를 찾기 위한 자료구조.
package chapter20230906.HashMap;
import java.util.*;
public class HashMap01 {
/* 이름을 key로, 점수를 value로 저장하기 */
public static void main(String[] args) {
// Map 컬렉션 생성
Map<String, Integer> map = new HashMap<>();
// <String, Integer> -> String을 키로, Integer를 값으로 사용
// 객체 저장
map.put("신용권", 85);
map.put("홍길동", 90);
map.put("동장군", 80);
map.put("홍길동", 95); // key가 같기 때문에 제일 마지막 저장한 값으로 대체
System.out.println("총 Entry 수 : " + map.size());
// 객체 찾기
// 이름(key)으로 점수(value)를 검색
System.out.println("\t홍길동 : " + map.get("홍길동")); // key로 정수 값 검색
System.out.println();
// 객체를 하나씩 처리
Set<String> keySet = map.keySet(); // keySet() : 모든 키를 Set 객체에 담아서 리턴. key Set 열기
Iterator<String> keyIterator = keySet.iterator();
// Iterator - 반복자 - 반복자는 객체 지향적 프로그래밍에서 배열이나 그와 유사한 자료구조의 내부요소를 순회하는 객체다
while (keyIterator.hasNext()) {
// hasNext - boolean형태로 다음 가져올 값이 있으면 true 없으면 false 반환
String key = keyIterator.next(); // next() - Iterator 안에 있는 다음 요소값 반환, 아무타입 가능
Integer value = map.get(key); // .get() - 주어진 키의 값(value)을 리턴
System.out.println("\t" + key + " : " + value);
}
System.out.println();
// foreach문을 사용해 출력
for(Map.Entry<String, Integer> entry : map.entrySet()) {
String strKey = entry.getKey();
Integer intValue = entry.getValue();
System.out.println(strKey + ":" + intValue);
}
System.out.println();
// foreach문을 사용해 출력 좀 더 쉬운편
for(var strKey : map.keySet()) {
Integer intValue = map.get(strKey);
System.out.println(strKey + ":" + intValue);
}
System.out.println();
// 객체 삭제
map.remove("홍길동"); // 키로 Map.Entry를 제거
System.out.println("총 Entry 수 : " + map.size()); // 총 Entrry 수 : 2
// 객체를 하나씩 정리
// entrySet() : 키와 값의 쌍으로 구성된 모든 Map.Enry 객체를 Set에 담아서 리턴
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);
}
System.out.println();
// 객체 전체 삭제
map.clear();
System.out.println("총 Entry 수 : " + map.size());
}
}
package chapter20230906.HashMap;
import java.util.*;
class Student { // 학번과 키가 같다면 동일한 키로 인식
public int sno;
public String name;
public Student(int sno, String name) {
this.sno = sno;
this.name = name;
}
@Override
public int hashCode() { // 학번과 이름이 같다면 동일한 값을 리턴
return sno + name.hashCode();
}
@Override
public boolean equals(Object obj) { // 학번과 이름이 같다면 true를 반환
if (obj instanceof Student) { // obj 와 Student 가 같은 객체인가
Student student = (Student)obj; // obj를 Student 객체로 다운
return (sno == student.sno) && (name.equals(student.name));
// 클래스 Student 안에 sno와 obj안에 sno가 같거나 클래스 Student 안에 name와 obj안에 name가 같으면 true리턴
}
else {
return false;
}
}
}
public class HashMap02 {
public static void main(String[] args) {
Map<Student, Integer> map = new HashMap<Student, Integer>();
// 학번과 이름이 동일한 Student를 키로 저장
map.put(new Student(1, "홍길동"), 95); // 하나 씩 넣어서 비교
map.put(new Student(1, "홍길동"), 95);
map.put(new Student(1, "박유신"), 85);
System.out.println("총 Entry 수 : " + map.size()); // 저장된 총 map.entry 수 얻기
}
}