본문 바로가기

Programming/JAVA

컬렉션 프레임워크(4) - Map 컬렉션 3 : Hashtable

JAVA logo image

 

 

 

 

사실 Hashtable은 HashMap과 동일한 내부 구조를 갖습니다. 그래서 이 역시 key로 사용할 객체는 hashCode( ), equals( ) 메서드 오버라이드를 통해 동등한 객체가 될 조건을 구성해야 합니다. 그럼 Hashtable과 HashMap의 근본적인 차이는 무엇일까요? 

 

Hashtable은 동기화(synchronized) 메서드로 구성되어 있습니다. 그래서 멀티 스레드 상에서 동시에 메서드 실행이 불가능하고, 하나의 스레드가 완료된 후에야 다른 스레드를 실행할 수 있습니다. 그래서 멀티 스레드를 사용하는 환경에서 객체와 관련된 삭제, 추가 작업이 안전합니다. 이를 두고 스레드가 안전(thread safe)라고 표현합니다. 

 

 

 


 

 

 

Map 인터페이스의 구현 클래스인 Hashtable의 생성 방법은 HashMap과 비슷하게, key 타입과 value타입을 지정하고, 기본 생성자를 호출합니다. 아래 라인에서 K는 key의 타입, V는 value의 타입을 의미합니다. 

 

아래 라인은 key를 String 타입으로 사용하고 value로 Integer를 사용하는 경우의 예시입니다.

 

Map<K, V> map = new Hashtable<K, V)();
Map<String, Integer> map = new Hashtable<String, Integer>();

 

 

 

 


 

 

 

다음 예시는, 키보드로 ID와 PW를 입력받아 Hashtable에 저장된 key(ID)와 value(Password)를 비교해서 로그인 여부를 출력하는 경우입니다. 

 

import java.util.*;

public class ExampleMain {
	public static void main(String[] args) {
		Map<String, String> map = new Hashtable<String, String>();
		
		
		// 임의의 ID와 PW를 선언
		map.put("spring", "12");
		map.put("summer", "123");
		map.put("fall", "1234");
		map.put("winter", "12345");
		
		// 키보드 입력 값을 받기 위해 선언
		Scanner scanner = new Scanner(System.in);
		
		while(true) {
			System.out.println("아이디와 비밀번호를 입력하세요");
			
			System.out.print("ID: ");
			String id = scanner.nextLine();
			
			System.out.print("PW: ");
			String password = scanner.nextLine();
			
			System.out.println();
			
			
			if(map.containsKey(id)) {	// 입력한 아이디인 key가 있는지 여부 확인
				if(map.get(id).equals(password)) {
					System.out.println("로그인 성공");
					break;
				} else {
					System.out.println("비밀번호 불일치");
				}
			} else {
				System.out.println("입력한 아이디가 존재하지 않습니다.");
			}
			
		}
	}
}

/* 출력 예시
아이디와 비밀번호를 입력하세요
ID: spring
PW: 13

비밀번호 불일치
아이디와 비밀번호를 입력하세요
ID: spring
PW: 12

로그인 성공
*/

 

 

ㅇㅇ