본문 바로가기

자바/자바 개념

[Java] HashMap<K, V> / 2021.01.01

* 참고 자료 : 명품 자바 프로그래밍

 

HashMap<K, V> 컬렉션은 경로명이 java.util.HashMap 이며, 키와 값의 쌍으로 구성되는요소를 다룬다. K는 '키'로 사용할 데이터 타입을, V는 '값'으로 사용할 데이터 타입의 타입매개변수이다. 

 

해시맵의 장단점 ? 

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

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

- 인덱스를 이용하여 요소에 접근할 수 없고 오직 '키'로만 검색해야한다.

 

- HashMap<K, V>의 주요 메소드

 

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

1. 해시맵 생성

해시맵은 HashMap<K, V>에서 K에는 '키'로 V에는 '값'으로 사용할 구체적인 타입을 지정하여 생성한다. 다음은 (영어, 한글) 단어 사전을 만들기 위해 K와 V를 모두 String 타입으로 지정한 사례이다.

* 요소들은 해시맵에 삽입된 순서로 저장되지 않는다.

 

HashMap<String, String> h = new HashMap<String, String>();
-> HashMap<String, String> h = new HashMap<>();

2. 해시맵에 요소 삽입 (put)

요소를 삽입할 때는 put() 메소드에 키와 값을 전달한다.

 

h.put("baby", "아기");
h.put("love", "사랑");
h.put("apple", "사과");

3. 키로 값읽기 (get)

다음과 같이 get() 메소드에 키를 전달하면, 값을 얻을 수 있다.

 

String kor1 = h.get("love"); // kor1 = "사랑"

만일 해시맵에 없는 key를 호출한다면 ? 
null을 리턴한다.

4. 키로 요소 삭제 (remove)

 

h.remove("apple"); // put("apple", "사과")로 삽입한 요소 삭제

5. 요소 개수 알아내기 (size)

 

int n = h.size(); // 현재 h 내에 있는 요소의 개수 리턴

6. 해시맵의 전체 검색 (keySet, Iterator)

해시맵의 모든 키를 알아낸 후, 각 키에 대해 하나씩 값을 알아내는 방식이다. 해시맵의 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 활용 예시 코드

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

(영어, 한글) 단어를 쌍으로 해시맵에 저장하고 영어로 한글을 검색하는 프로그램을 작성하라.

"exit"이 입력되면 프로그램을 종료한다.

 

package Chapter7;
import java.util.*;

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

 

출력 결과 : 

 

 

- 해시맵에 객체 저장, 학생 정보 관리

id와 tel로 구성되는 Student 클래스를 만들고, 이름을 키로 하고 Student 객체를 값으로 하는 해시맵을 작성하라.

 

package Chapter7;
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) {
		HashMap<String, Student> map = new HashMap<>();
		map.put("황기태", new Student(1, "010-1111-1111"));
		map.put("이재문", new Student(2, "010-2222-2222"));
		map.put("김남윤", new Student(3, "010-3333-3333"));
		
		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.print("검색할 이름? ");
			String name = sc.nextLine();
			if(name.equals("exit"))
				break;
			Student student = map.get(name);
			if(student == null)
				System.out.println(name + "은 없는 사람입니다.");
			else
				System.out.println("id: " + student.getId() +", 전화: " +student.getTel());
		}
		sc.close();
	}
}

 

출력 결과 :