JAVA 프로그래밍을 하다 보면 데이터를 저장하고 검색하기 위해 다양한 자료구조가 필요합니다. 그 중에서도 HashMap은 매우 유용한 자료구조 중 하나입니다. 이 글에서는 Java HashMap에 대해 개념을 소개하고 활용법을 알아보겠습니다.
소개
JAVA 에서 Map 인터페이스에 대해 들어보았을 것입니다 (이 인터페이스는 Collection 인터페이스를 확장합니다). Map 인터페이스의 몇 가지 구현 클래스 중 하나는 HashMap입니다 (java.util 패키지에 포함되어 있음). 이것은 HashMap로 표시되며 여기서 K는 키를 나타내고 V는 값(value)을 나타냅니다. 간단히 말해, HashMap는 키-값 쌍의 형태로 요소를 저장하는 데이터 구조입니다. 키는 고유하며 중복 키가 허용되지 않습니다. 이는 키를 기반으로 값을 저장하며 키를 사용하여 액세스할 수 있습니다. HashMap은 하나의 null 키만 허용합니다. 값은 모두 null 일 수 있습니다.
HashMap 은 다음과 같은 특징이 있습니다.
- HashMap은 동기화되지 않으므로 스레드로부터 안전하지 않습니다. 여러 스레드가 동시에 HashMap에 액세스하면 맵이 구조적으로 수정됩니다.
- HashMap은 키-값 쌍의 정렬되지 않은 컬렉션입니다. 삽입 순서는 유지하지 않습니다.
- HashMap은 배열 또는 연결 리스트에 비해 데이터를 검색하는 것이 훨씬 빠르며 기본 작업에 대한 일정한 시간 성능을 제공합니다.
- HashMap의 초기 기본 용량(저장할 수 있는 요소의 수)은 16이며 기본 로드 팩터는 0.75입니다. 이후 섹션에서 용량과 로드 팩터에 대해 조금 더 자세히 설명하겠습니다.
계층 구조
계층 다이어그램을 확인하세요. HashMap 클래스는 AbstractMap 클래스를 확장하고 Map, Serializable 및 Cloneable 인터페이스를 구현합니다.
HashMap 클래스의 선언 :
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
- K: 키의 유형
- V: 값의 유형
HashMap의 생성자
HashMap에는 네 가지 생성자가 있으며 모두 public 접근 지정자를 갖습니다.
1. HashMap()
이것은 초기 용량이 16이고 로드 팩터가 0.75인 HashMap의 인스턴스를 생성하는 기본 생성자입니다.
HashMap<K,V> hm = new HashMap<K,V>(); // 인스턴스 생성
기본 HashMap 생성자를 보여주는 프로그램 :
import java.io.*;
import java.util.*;
public class HashMap{
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
삽입 순서는 유지되지 않음
2. HashMap(int initialCapacity)
이 생성자는 지정된 초기 용량과 기본 로드 팩터 0.75로 HashMap의 인스턴스를 생성합니다.
HashMap<K,V> hm = new HashMap<K,V>(int initialCapacity); // 인스턴스 생성
위의 HashMap 생성자를 보여주는 프로그램 :
import java.io.*;
import java.util.*;
public class HashMap{
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>(5);
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
3. HashMap(int initialCapacity, float loadFactor)
이 생성자는 지정된 초기 용량과 지정된 로드 팩터로 HashMap의 인스턴스를 생성합니다.
HashMap<K,V> hm = new HashMap<K,V>(int initialcapacity, float loadfactor); // 인스턴스 생성
위의 HashMap 생성자를 보여주는 프로그램 :
import java.io.*;
import java.util.*;
public class HashMap {
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>(5,0.75f);
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
4. HashMap(Map map)
이 생성자는 주어진 Map과 유사한 매핑을 갖는 HashMap의 인스턴스를 생성합니다.
HashMap<K,V> hm = new HashMap<K,V>(Map m); // 인스턴스 생성
위의 HashMap 생성자를 보여주는 프로그램 :
import java.io.*;
import java.util.*;
public class HashMap {
public static void main(String args[]) {
Map<String, Integer> hm = new HashMap<String, Integer>();
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
HashMap<String, Integer> hm1 = new HashMap<String, Integer>(hm);
System.out.println(hm1);
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
{Red=1, Blue=2, Yellow=4, Green=3}
HashMap 작업하기
이제 HashMap의 몇 가지 사용 예시를 살펴보겠습니다.
1. HashMap에 요소 추가하기
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
// HashMap 인스턴스 생성
HashMap<String, Integer> hm = new HashMap<String, Integer>();
// 요소 추가
hm.put("Apple", 10);
hm.put("Banana", 20);
hm.put("Orange", 30);
// 결과 출력
System.out.println("HashMap: " + hm);
}
}
출력:
HashMap: {Apple=10, Orange=30, Banana=20}
2. HashMap에서 요소 제거하기
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
// HashMap 인스턴스 생성
HashMap<String, Integer> hm = new HashMap<String, Integer>();
// 요소 추가
hm.put("Apple", 10);
hm.put("Banana", 20);
hm.put("Orange", 30);
// 요소 제거
hm.remove("Banana");
// 결과 출력
System.out.println("HashMap: " + hm);
}
}
출력:
HashMap: {Apple=10, Orange=30}
3. HashMap 요소 가져오기
1 특정 키와 연관된 값에 액세스하기
HashMap 내의 값은 get(K) 메서드를 사용하여 액세스할 수 있습니다. 키를 인수로 전달해야하며 해당 키에 저장된 값이 검색됩니다.
get(K) 메서드를 사용하여 값을 액세스하는 프로그램 :
import java.io.*;
import java.util.*;
public class Hashmap{
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
System.out.println(hm.get("Green"));
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
2 요소의 키(key)만 액세스하기
만약 요소의 키(key) 집합만 검색하고 싶다면, keySet() 메서드는 HashMap의 키(key) 집합만 반환합니다.
메서드 keySet()의 사용법을 보여주는 프로그램 :
import java.io.*;
import java.util.*;
public class Hashmap{
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
System.out.println(hm.keySet());
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
[Red, Blue, Yellow, Green]
3 요소의 값(value)만 액세스하기
values() 메서드를 사용하여 값을 가져올 수 있습니다.
values() 메서드 사용법 보여주는 프로그램 :
import java.io.*;
import java.util.*;
public class Hashmap{
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
System.out.println(hm.values());
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
[1, 2, 4, 3]
4 HashMap의 항목(entries)에 액세스하기
entrySet() 메서드는 HashMap의 항목() 집합을 반환합니다.
entrySet() 메서드 사용법 보여주는 프로그램 :
import java.io.*;
import java.util.*;
public class Hashmap{
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
System.out.println(hm.entrySet());
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
[Red=1, Blue=2, Yellow=4, Green=3]
5 HashMap 순회하기
HashMap의 요소에 액세스하는 방법을 알았으니, 이제 HashMap을 반복하거나 순회하는 방법을 살펴보겠습니다. 아이디어는 for-each 루프를 사용하여 항목 집합을 반복하고, getKey() 및 getValue() 메서드를 사용하여 항목의 키 및 값에 액세스하는 것입니다. 우리는 Map.Entry(K, V)를 사용하여 맵의 항목에 액세스할 수 있습니다.
HashMap 항목을 순회하는 프로그램 :
import java.io.*;
import java.util.*;
public class Hashmap{
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
for(Map.Entry<String, Integer> e: hm.entrySet())
{
System.out.println(e.getKey()+","+e.getValue());
}
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
Red,1
Blue,2
Yellow,4
Green,3
HashMap 값 업데이트하기
특정 키에 저장된 값을 업데이트하려면 put(K, V) 또는 replace() 메서드를 사용할 수 있습니다.
put()을 사용하여 값을 업데이트하는 프로그램:
import java.io.*;
import java.util.*;
public class Hashmap{
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
hm.put("Yellow",5); // 키 Yellow의 값을 업데이트합니다.
System.out.println(hm);
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
{Red=1, Blue=2, Yellow=5, Green=3}
replace(K,V)를 사용하여 업데이트하는 프로그램:
import java.io.*;
import java.util.*;
public class Hashmap{
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
hm.replace("Yellow",6);
System.out.println(hm);
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
{Red=1, Blue=2, Yellow=6, Green=3}
HashMap 메서드들
매서드 | 설명 |
put(K key,V value) | 맵에 항목을 삽입합니다. |
putAll(Map map) | 지정된 맵을 맵에 삽입합니다. |
putIfAbsent(K key, V value) | 키가 없는 경우에만 항목을 삽입합니다. |
remove(K key) | 지정된 키에 대한 항목을 삭제합니다. |
remove(K key,V value) | 지정된 키 및 값에 대한 항목을 삭제합니다. |
clear() | 맵에서 모든 매핑을 제거합니다. |
isEmpty() | 맵에 키–값 매핑이 없는 경우 true를 반환합니다. |
size() | 키–값 매핑의 수를 반환합니다. |
keySet() | HashMap의 키 집합을 반환합니다. |
values() | HashMap의 값 집합을 반환합니다. |
entrySet() | 해시 맵에서 항목 집합(K, V)을 반환합니다. |
get(K key) | 지정된 키와 연결된 값을 반환합니다. |
replace(K key, V value) | 지정된 키를 지정된 값으로 바꿉니다. |
replace(K key,V oldvalue,V newvalue) | 이전 값을 지정된 키의 새 값으로 바꿉니다. |
containsKey(K key) | 지정된 키가 HashMap에 있는 경우 true를 반환합니다. |
containsValue(V value) | 지정된 값이 HashMap에 있는 경우 true를 반환합니다. |
hashCode() | 개체의 메모리 주소를 정수 형식으로 반환합니다. |
equals(Object O) | 지정된 개체를 맵과 비교하고 동일한 경우 true를 반환합니다. |
clone() | HashMap 인스턴스의 얕은 복사본을 반환합니다. |
getOrDefault(K key, V defaultValue) | 지정된 키가 매핑되는 값을 반환하거나 키가 매핑되지 않은 경우 기본값을 반환합니다. |
void forEach(BiConsumer<? super K,? super V> action) | 모든 항목이 처리되거나 예외가 발생할 때까지 모든 항목에 대해 지정된 작업을 실행합니다. |
V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) | 지정된 키가 값에 매핑되지 않거나 키가 null인 경우 지정된 값으로 매핑합니다. |
void replaceAll(BiFunction<? super K,? super V,? extends V> function) | 각 항목 값을 처리된 후 함수의 결과로 바꿉니다. |
V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) | 지정된 키와 현재 매핑된 값에 대한 매핑을 계산합니다. 현재 매핑이 없는 경우 null을 반환합니다. |
V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) | 지정된 키가 아직 값과 연결되어 있지 않은 경우(또는 null에 매핑된 경우) 지정된 매핑 함수를 사용하여 값을 계산하고 null이 아닌 경우 이 맵에 입력합니다. |
V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) | 지정된 키의 값이 있고 null이 아닌 경우 키와 현재 매핑된 값이 지정된 새 매핑을 계산합니다. |
hashmap 기능의 몇 가지 예 :
해시 맵의 크기를 표시하는 프로그램 :
import java.io.*;
import java.util.*;
public class Hashmap{
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
System.out.println(hm.size());
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
4
putAll() 및 putIfAbsent() 메서드를 보여주는 프로그램 :
import java.io.*;
import java.util.*;
public class Hashmap{
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
HashMap<String, Integer> hm1 = new HashMap<String, Integer>();
hm1.putAll(hm); //putAll
System.out.println(hm1);
hm.putIfAbsent("Orange",7); //putIfAbsent
System.out.println(hm);
}
}
출력 :
{Red=1, Blue=2, Yellow=4, Green=3}
{Red=1, Blue=2, Yellow=4, Green=3}
{Red=1, Blue=2, Yellow=4, Orange=7, Green=3}
containsKey() 및 containsValue() 메소드를 표시하는 프로그램 :
import java.io.*;
import java.util.*;
public class Hashmap{
public static void main(String args[]) {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("Red",1);
hm.put("Blue",2);
hm.put("Green",3);
hm.put("Yellow",4);
System.out.println(hm);
System.out.println(hm.containsKey("Green"));
System.out.println(hm.containsKey("Orange"));
System.out.println(hm.containsValue(3));
System.out.println(hm.containsValue(7));
}
}
출력:
{Red=1, Blue=2, Yellow=4, Green=3}
true
false
true
false
결론
Java에서 HashMap은 데이터를 효율적으로 저장하고 검색하는 데 매우 유용한 자료구조입니다. 이를 잘 이해하고 활용한다면 프로그래밍 작업을 보다 효율적으로 수행할 수 있습니다.