HashMap 정리
1) HashMap 기본 개념
- 키(key)–값(value) 쌍으로 데이터 저장
- 키는 중복 불가, 값은 중복 허용
- 순서 보장 안 됨 (삽입 순서 유지 필요시 → LinkedHashMap 사용)
- 탐색/삽입 평균 O(1) (해시 기반)
2) 주요 메서드 표
| 메서드 | 설명 |
| put(K key, V value) | 값 추가/수정 (키 중복 시 기존 값 덮어씀) |
| get(Object key) | 키에 해당하는 값 반환 (없으면 null) |
| containsKey(Object key) | 특정 키 존재 여부 |
| containsValue(Object value) | 특정 값 존재 여부 |
| remove(Object key) | 키 삭제, 삭제된 값 반환 (없으면 null) |
| replace(K key, V value) | 키의 값을 새 값으로 교체 |
| clear() | 모든 데이터 삭제 |
| size() | 데이터 개수 반환 |
| keySet() | 키만 모아 Set으로 반환 |
| values() | 값만 모아 Collection으로 반환 |
| entrySet() | 키–값 쌍을 Map.Entry Set으로 반환 |
3) Ex11_HashMap — 기본 사용 & 입력 검증
Map<String, Integer> hm = new HashMap<>();
System.out.println(hm.size()); // 0
hm.put("펭구", 10);
hm.put("모코코", 20);
hm.put("배불뚝이", 30);
hm.put("배불뚝이", 50); // 동일 키 → 값 덮어쓰기
System.out.println(hm.size()); // 3
System.out.println(hm); // {펭구=10, 모코코=20, 배불뚝이=50}
Integer v = hm.get("배불뚝이"); // 50
System.out.println(v);
System.out.println(hm.containsKey("배불뚝이")); // true
System.out.println(hm.containsValue(50)); // true
System.out.println(hm.containsValue(111)); // false
// 사용자 입력으로 검색
Scanner sc = new Scanner(System.in);
System.out.print("이름 입력 :");
String name = sc.next();
if (hm.containsKey(name)) {
System.out.println(hm.get(name));
} else {
System.out.println("찾는 이름이 없습니다.");
}
포인트
- put은 같은 키가 오면 값 덮어쓰기
- get은 키 없을 때 null 반환 → 조건문 주의
- containsKey/containsValue 활용 가능
4) Ex12_HashMap — 간단 영어 사전
Map<String, String> dic = new HashMap<>();
dic.put("pencil", "연필");
dic.put("banana", "바나나");
dic.put("desk", "책상");
dic.put("sky", "하늘");
System.out.println(dic);
Scanner sc = new Scanner(System.in);
do {
System.out.print("찾는 단어는? 나가기q: ");
String input = sc.next();
if (input.equals("q")) {
System.out.println("프로그램 종료!");
break;
}
if (dic.containsKey(input)) {
System.out.println(dic.get(input));
} else {
System.out.println("없습니다.");
}
} while (true);
포인트
- 사전 프로그램: 키 = 영어, 값 = 한국어
- 존재 여부는 containsKey → 있으면 get으로 값 출력
5) Ex13_HashMap — 사용자 정의 객체(Movie) 저장
class Movie {
private String title;
private int age;
public Movie(String title, int age) {
this.title = title;
this.age = age;
}
public String toString() {
return title + "/" + age;
}
}
public class Ex13_HashMap {
public static void main(String[] args) {
Movie m1 = new Movie("좀비딸", 12);
Movie m2 = new Movie("F1", 12);
Movie m3 = new Movie("귀멸의 칼날", 12);
Map<String, Movie> movie = new HashMap<>();
movie.put("롯데시네마", m1);
movie.put("CGV", m2);
movie.put("메가박스", m3);
// keySet으로 순회
Set<String> keys = movie.keySet();
for (String s : keys) {
System.out.println(s + ":" + movie.get(s));
}
// replace로 값 교체
Movie m4 = new Movie("국제시장", 15);
movie.replace("메가박스", m4);
// remove — 삭제된 값 반환
Movie rm = movie.remove("CGV");
System.out.println(rm);
System.out.println(movie);
movie.clear();
System.out.println(movie); // {}
}
}
포인트
- Map<String, Movie>로 사용자 정의 객체 저장 가능
- keySet()으로 키만 추출 후, map.get(key)로 값 접근
- replace(key, value)는 교체, remove(key)는 삭제된 값 반환
- clear()로 전체 삭제 가능
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
class Company{
private String part;
private String position;
private int grade;
public Company(String part, String position, int grade) {
super();
this.part = part;
this.position = position;
this.grade = grade;
}
public String toString() {
return part + "/" + position + "/" + grade;
}
}//Company
public class Ex14_이정륜 {
public static void main(String[] args) {
Map<String, Company> c = new HashMap<String, Company>();
String name, part, position, exit;
int grade;
Scanner sc = new Scanner(System.in);
// 정보입력
while(true) {
try {
System.out.print("이름 : ");
name = sc.next();
System.out.print("부서 : ");
part = sc.next();
System.out.print("직급 : ");
position = sc.next();
System.out.print("평점 : ");
grade = sc.nextInt();
Company com = new Company(part, position, grade);
c.put(name, com);
}catch(Exception e) {
System.out.println("잘못 입력했습니다. 다시 입력하세요");
}
System.out.println("계속? y/n");
exit = sc.next();
if(exit.equals("n")) {
System.out.println(c);
break;
}else {
}
}
//정보찾기
while(true) {
boolean findname = false;
System.out.println("찾는 이름 : ");
name = sc.next();
// 방법1)
Set<String>key = c.keySet();
for(String x : key) {
if(x.equals(name)) {
System.out.println(c.get(name));
findname = true;
}
}
if(findname == false) {
System.out.println("찾는 이름 없음");
}
// 방법2)
// 여기서 c.get(name) 자체가 Company 객체를 반환
// Company 클래스에서 toString()을 오버라이딩 해놨으니까,
// 그냥 System.out.println(c.get(name)) 만으로 part/position/grade 문자열이 출력
if(c.containsKey(name)) {
System.out.println(c.get(name));
findname = true;
}
if(findname == false) {
System.out.println("찾는 이름 없음");
}
// 방법3
if(c.get(name) == null) {
System.out.println("찾는이름 없음");
}else {
System.out.println(c.get(name));
}
System.out.println("계속? y/n");
exit = sc.next();
if(exit.equals("n")) {
break;
}
}
// 정보삭제
while(true) {
System.out.println("삭제 할 이름 : ");
name = sc.next();
if(c.containsKey(name)) {
c.remove(name);
System.out.println("삭제되었습니다.");
}else {
System.out.println("찾지 못했습니다.");
}
System.out.println("계속? y/n");
exit = sc.next();
if(exit.equals("n")) {
System.out.println("프로그램 종료");
break;
}
}
}
}
/*
이름 : kim
부서 : 연구부
직급 : 대리
평점 : 7
계속?y
이름 : park
부서 : 인사부
직급 : 과장
평점 : 6
계속?n
{kim=연구부/대리/7, park=인사부/과장/6}
찾는 이름:hong
찾는 이름 없음
계속?y
찾는 이름:park
인사부/과장/6
계속?n
삭제할 이름:jung
찾는 이름 없음
계속?y
삭제할 이름:park
{kim=연구부/대리/7}
계속?n
프로그램을 종료합니다.
*/
6) 마무리 요약
- HashMap = 키-값 구조, 키 중복 불가 / 값 중복 허용
- 주요 메서드: put, get, containsKey, containsValue, remove, replace, keySet
- 활용 예시:
- 간단 데이터 저장 (Ex11)
- 영어 사전 프로그램 (Ex12)
- 객체 저장 및 관리 (Ex13)
'기초 및 언어 > ▶ Java&JSP' 카테고리의 다른 글
| 36. Buffer (0) | 2025.08.29 |
|---|---|
| 35. 바이트스트림 (0) | 2025.08.26 |
| 33. HashSet (0) | 2025.08.26 |
| 32. Vector와 Enumeration (1) | 2025.08.26 |
| 31. ArrayList (5) | 2025.08.24 |