본문 바로가기

자바공부

HashMap, 자바 명품 프로그래밍 7장

728x90
반응형

* HashMap<K, V> 컬렉션은 java.util.HashMap의 경로에 있다.

'키(Key)'와 '값(Value)'의 쌍으로 구성되는 요소를 다룬다. 

K는 '키'로 사용할 데이터 타입, V는 '값'으로 사용할 데이터 타입의 타입매개변수이다.

해시맵은 내부에 '키'와 '값'을 저장하는 자료 구조를 가지고, put(), get() 메소드를 이용하여 요소를 삽입하거나 검색한다.

HashMap<String. String>의 내부 구성

HashMap<String, String> h = new HashMap<String, String>(); // 해시맵 생성
h.put("apple", "사과"); // "apple" 키와 "사과" 값의 쌍을 h에 삽입
String kor = h.get("apple"); // "apple" 키로 값 검색. kor는 검색된 값, "사과"

* 해시맵의 장단점

장점)

1. 요소의 삽입, 삭제 시간이 매우 빠르다.

요소의 위치를 결정하는 해시 함수가 간단한 코드로 이루어지며, Vector와 ArrayList와 달리 요소의 삽입 삭제 시 다른 요소들의 위치 이동이 필요 없기 때문이다.

2. 요소 검색은 더욱 빠르다.

해시맵의 get(key) 메소드가 호출되면 해시 함수는 key가 저장된 위치를 단번에 찾아내기 때문에 모든 요소를 하나씩 비교하는 Vector 혹은 ArrayList보다 빠르다.

단점)

1. 오직 '키'로만 검색해야 한다.

해시맵은 인덱스를 이용하여 요소에 접근할 수 없다.

 

* HashMap<K, V> 클래스의 주요 메소드

메소드 설명
void clear() 해시맵의 모든 요소 삭제
boolean containsKey(Obejct key) 지정된 키(key)를 포함하고 있으면 true 리턴
boolean containsValue(Object value) 지정된 값(value)에 일치하는 키가 있으면 true 리턴
V get(Object key) 지정된 키(key)의 값 리턴, 키가 없으면 null 리턴
boolean isEmpty() 해시맵이 비어 있으면 true 리턴
Set<K> keySet() 해시맵의 모든 키를 담은 Set<K> 컬렉션 리턴
V put(K key, V value) key와 value 쌍을 해시맵에 저장
V remove(Object key) 지정된 키(key)를 찾아 키와 값 모두 삭제
int size() HashMap에 포함된 요소의 개수 리턴

 

* 해시맵의 전체 검색

해시맵의 모든 '키'를 알아낸 후, 각 '키'에 대해 하나씩 '값'을 알아내는 방식으로 작성한다.

HashMap의 keySet()메소드는 모든 '키'를 Set 컬렉션으로 만들어 리턴한다.

 

Set<String> keys = h.keySet(); // 해시맵 h에 있는 모든 키를 Set 컬렉션으로 리턴
Iterator<String> it = keys.iterator(); // Set의 각 문자열을 순차 검색하는 Iterator 리턴
while(it.hasNext()){
	String key = it.next(); // 키
    String value = h.get(key); // 값
    System.out.println("(" + key + "," + value + ")"); // 키와 값의 쌍 출력
}

* HashMap<String, String> 컬렉션의 삽입 삭제 사례

* HashMap을 이용하여 (영어, 한글)단어 쌍의 저장 검색

package Ch7_Ex;

import java.util.*;

public class HashMapDirEx {
	public static void main(String[] args) {
		HashMap<String, String> dic = new HashMap<String, String>(); // 해시맵 생성
			// var dic = new HashMap<String, String>(); 으로 간략히 쓸 수 있음
		
		// 3개의 (key, value) 쌍을 dic에 저장
		dic.put("baby", "아기");
		dic.put("love", "사랑");
		dic.put("apple", "사과");
		
		// 사용자로부터 영어 단어를 입력받고 한글 단어 검색. "exit" 입력받으면 종료
		Scanner scanner = new Scanner(System.in);
		while(true) {
			System.out.println("찾고 싶은 단어는?");
			String eng = scanner.next();
			if(eng.equals("exit")) {
				System.out.println("종료합니다...");
				break;
			}
			// 해시맵에서 '키' eng의 '값' kor 검색
			String kor = dic.get(eng); // eng가 해시맵에 없다면 null 리턴
			if(kor==null)
				System.out.println(eng + "는 없는 단어 입니다.");
			else
				System.out.println(kor);
		}
		scanner.close();
	}
}

 

* HashMap을 이용하여 자바 과목의 이름과 점수 관리

package Ch7_Ex;

import java.util.*;

public class HashMapScoreEx {
	public static void main(String[] args) {
		// 이름과 점수를 저장할 HashMap 컬렉션 생성
		HashMap<String, Integer> scoreMap = new HashMap<String, Integer>();
			// var scoreMap = new HashMap<String, Integer>(); 으로 간략히 쓸 수 있음
		
		// 5개 점수 저장
		scoreMap.put("김성동", 97);
		scoreMap.put("황기태", 88);
		scoreMap.put("김남윤", 98);
		scoreMap.put("이재문", 70);
		scoreMap.put("한원선", 99);
		
		System.out.println("HashMap의 요소 개수 : " + scoreMap.size());
		
		// 모든 사람의 점수 출력. scoreMap에 들어 있는 모든 (key, value) 쌍 출력
		Set<String> keys = scoreMap.keySet(); // 모든 key를 가진 Set 컬렉션 리턴
		Iterator<String> it = keys.iterator(); // Set에 있는 모든 key를 순서대로 검색하는 Iterator 리턴
		
		while(it.hasNext()) {
			String name = it.next();	// 다음 키. 학생 이름
			int score = scoreMap.get(name);	// 점수 알아내기
			System.out.println(name + " : " + score);
		}
	}
}

주의할 사항으로는 출력된 결과가 삽입된 순서와 다르다는 점이다.

 

* HashMap에 객체 저장, 학생 정보 관리

package Ch7_Ex;

import java.util.*;

class Student {
	private int id;
	private String tel;
	public Student(int id, String tel) {this.id = id; this.tel = tel;}
	public int getId() {
		return id;
	}
	public String getTel() {
		return tel;
	}
}

public class HashMapStudentEx {
	public static void main(String[] args) {
		// (학생 이름, Student 객체)를 저장하는 해시맵 생성
		HashMap<String, Student> map = new HashMap<String, Student>();
		map.put("황기태", new Student(1, "010-111-1111"));
		map.put("이재문", new Student(2, "010-222-1111"));
		map.put("김남윤", new Student(3, "010-333-1111"));
		
		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.println("검색할 이름?");
			String name = sc.nextLine(); // 사용자로부터 이름 입력
			if(name.equals("exit"))
				break;	// while 문을 벗어나 프로그램 종료
			Student student = map.get(name); // 이름에 해당하는 Student 객체 검색
			if(student == null)
				System.out.println(name + "은 없는 사람입니다.");
			else
				System.out.println("id : " + student.getId() + ", 전화 : " + student.getTel());
		}
		sc.close();
	}
}

반응형