HashMap과 Hashtable의 차이점은 무엇인가요?
HashMap과 Hashtable은 둘 다 자바에서 키-값 쌍으로 데이터를 저장하는 컬렉션 클래스이지만, 여러 가지 중요한 차이점이 있습니다.
주요 차이점은 다음과 같습니다: 1. 동기화(Synchronization) - Hashtable 은 메서드들이 `synchronized`로 선언되어 있어, 멀티스레드 환경에서 자동으로 동기화됩니다.
따라서 멀티스레드에서 안전하게 사용할 수 있지만, 동기화 오버헤드 때문에 성능이 떨어질 수 있습니다.
- HashMap 은 기본적으로 동기화되지 않으며, 멀티스레드 환경에서 안전하지 않습니다.
필요하다면 `Collections.synchronizedMap()` 메서드를 이용해 동기화된 맵으로 만들거나, `ConcurrentHashMap`을 사용해야 합니다.
2. null 허용 여부 - Hashtable 은 키(key) 와 값(value) 모두에 대해 `null`을 허용하지 않습니다.
- HashMap 은 키에는 단 하나의 `null`을 허용하며, 값에는 다수의 `null`을 허용합니다.
3. 성능 - HashMap 이 동기화가 없기 때문에 단일 스레드 환경 및 동기화를 직접 관리할 때 더 빠릅니다.
- Hashtable 은 동기화 오버헤드 때문에 같은 작업을 수행할 때 상대적으로 느립니다.
4. 상속 구조 - Hashtable 은 `Dictionary` 클래스를 상속받습니다.
`Dictionary`는 오래된 추상 클래스입니다.
- HashMap 은 `AbstractMap` 클래스를 상속받아, 더 현대적인 컬렉션 프레임워크의 일부입니다.
5. 사용 권장 여부 - 현재는 HashMap 이 더 많이 사용되며, `ConcurrentHashMap` 같은 동시성을 지원하는 새로운 클래스들이 멀티스레드 환경에 권장됩니다.
- Hashtable 은 레거시(legacy) 코드에서만 주로 발견됩니다.
--- 요약 | 특성 | HashMap | Hashtable | |-----------------|-------------------------------|-------------------------------| | 동기화 여부 | 비동기화 (필요 시 외부 동기화 필요) | 동기화됨 (메서드가 synchronized) | | null 허용 여부 | 키 한 개의 null 허용, 값 다수 null 허용 | 키, 값 모두 null 허용 안 함 | | 성능 | 빠름 (동기화 없음) | 느림 (동기화로 인한 오버헤드) | | 상속 구조 | AbstractMap | Dictionary (레거시) | | 사용 권장 여부 | 권장 (현대적 대체제 사용 권장) | 비권장 (레거시, 유지보수용) | --- 결론 - 멀티스레드 환경 에서 안전한 해시맵이 필요하더라도 `Hashtable` 보다는 `ConcurrentHashMap`을 사용하는 것이 더 좋은 선택입니다.
- 싱글 스레드 환경 이나 직접 동기화를 관리하는 경우, `HashMap`을 사용하는 것이 적합합니다.
- null 키와 값을 허용해야 한다면 반드시 `HashMap`을 선택해야 합니다.
이러한 차이점을 바탕으로 상황에 맞는 컬렉션 클래스를 선택하면 됩니다.