JAVA HashMap: 개념 및 활용법

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입니다. 이후 섹션에서 용량과 로드 팩터에 대해 조금 더 자세히 설명하겠습니다.

계층 구조

JAVA HashMap: 개념 및 활용법

계층 다이어그램을 확인하세요. 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은 데이터를 효율적으로 저장하고 검색하는 데 매우 유용한 자료구조입니다. 이를 잘 이해하고 활용한다면 프로그래밍 작업을 보다 효율적으로 수행할 수 있습니다.

Leave a Comment