관리 메뉴

나만을 위한 블로그

[JAVA] HashTable이란? 본문

JAVA

[JAVA] HashTable이란?

참깨빵위에참깨빵 2020. 10. 25. 02:16
728x90
반응형

이번 포스팅에선 HashTable(이하 해시테이블)에 대해서 정리하려고 한다.

먼저 해시테이블이 뭔지부터 알아보자.

 

해시란? 단방향 암호화 기법이다. 해시함수(알고리즘)을 써서 고정된 길이의 암호화된 문자열로 바꾸는 걸 의미

해시함수란? 임의의 길이를 가진 데이터를 고정된 길이의 데이터로 매핑하는 함수. 이 때 매핑하기 전의 원래 데이터 값을 키, 매핑 후 데이터의 값을 해시값(hash value), 매핑하는 과정을 해싱(hashing)이라고 한다.

 

뉘앙스로는 해시함수의 뜻이 더 가깝다. 해시테이블의 기능 자체가 해시함수와 같은 맥락의 기능이기 때문이다.

그럼 테이블은 뭘까? DB를 공부했다면 알겠지만 모른다면 엑셀을 생각하면 된다.

 

정리하면 테이블 형태로 키와 값을 매핑하는 걸 해시테이블이라고 하는 것 같다.

구글에 검색해서 해시테이블 자체를 검색하면 아래 결과가 나온다.

 

- 컴퓨팅에서 해시 테이블(해시 맵)은 키를 값에 매핑할 수 있는 구조인 연관 배열 추상 데이터 유형을 구현하는 데이터 구조다

 

대충 키밸류를 서로 엮은 자료구조라는 뜻이다. 파이썬의 딕셔너리 자료형이 이와 비슷한 형태다.

그럼 자바에서 해시테이블을 어떻게 쓰는지 보자.

 

import java.util.Hashtable;

public class Test
{
    public static void main(String[] args)
    {
        Hashtable<Integer, String> hashtable = new Hashtable<>();
        hashtable.put(0, "첫번째 값");
        hashtable.put(1, "두번째 값");
        hashtable.put(2, "세번째 값");
        hashtable.put(3, "네번째 값");
    }
}

선언은 ArrayList와 비슷하게 한다. 하지만 제네릭 안에 들어가는 타입이 2개다.

해시테이블에 값을 넣을 때는 put()을 쓰며 1번 인자로 키를 넣고, 2번 인자로 밸류를 넣으면 된다.

이 상태에서 println()으로 hashtable을 출력하면 아래와 같은 결과가 나온다.

 

0부터 나오는 게 아니라 마지막에 넣은 3부터 키와 밸류가 나오는 걸 볼 수 있다.

그럼 1번째 키부터 나오게 하려면 어떻게 해야 할까? for문으로 뽑아내면 된다.

 

import java.util.Hashtable;

public class Test
{
    public static void main(String[] args)
    {
        Hashtable<Integer, String> hashtable = new Hashtable<>();
        hashtable.put(0, "첫번째 값");
        hashtable.put(1, "두번째 값");
        hashtable.put(2, "세번째 값");
        hashtable.put(3, "네번째 값");
        System.out.println(hashtable);
        for (int i = 0; i < hashtable.size(); i++)
        {
            System.out.println(hashtable.get(i));
        }
    }
}

 

이렇게 value만 나오는 걸 볼 수 있다.

for문을 쓰지 않고 하나의 키에 담긴 value만 보고 싶다면 getOrDefault()를 쓰면 된다.

 

import java.util.Hashtable;

public class Test
{
    public static void main(String[] args)
    {
        Hashtable<Integer, String> hashtable = new Hashtable<>();
        hashtable.put(0, "첫번째 값");
        hashtable.put(1, "두번째 값");
        hashtable.put(2, "세번째 값");
        hashtable.put(3, "네번째 값");
        System.out.println(hashtable.getOrDefault(0, ""));
    }
}

 

이 메서드는 0이라는 키에 매핑된 value를 불러오는데, 없을 경우 value의 자료형에 맞는 기본값을 반환한다.

이 예제에선 0이란 키에 첫번째 값이란 문자열이 매핑돼 있으니 첫번째 값을 리턴하지만, 만약 없다면 공백이 출력된다.

 

다음은 해시테이블 안에 특정 값이 있는지 찾아보는 메서드 2개를 확인해보자.

 

import java.util.Hashtable;

public class Test
{
    public static void main(String[] args)
    {
        Hashtable<Integer, String> hashtable = new Hashtable<>();
        hashtable.put(0, "첫번째 값");
        hashtable.put(1, "두번째 값");
        hashtable.put(2, "세번째 값");
        hashtable.put(3, "네번째 값");
        System.out.println(hashtable.containsKey(2));
        System.out.println(hashtable.containsValue("다섯번째 값"));
    }
}

containsKey()는 2라는 숫자 키가 있는지 확인한 후 T/F를 리턴하고, containsValue()는 안의 value값이 있는지 확인한 후 T/F를 리턴한다.

containsKey()의 경우는 2라는 키가 있으니 true를 리턴하고, containsValue()는 다섯번째 값이란 문자열이 해시테이블에 없으니 false를 리턴한다.

 

다음은 해시테이블의 크기를 확인하는 메서드다. ArrayList와 똑같이 size()로 크기를 확인할 수 있다.

 

import java.util.Hashtable;

public class Test
{
    public static void main(String[] args)
    {
        Hashtable<Integer, String> hashtable = new Hashtable<>();
        hashtable.put(0, "첫번째 값");
        hashtable.put(1, "두번째 값");
        hashtable.put(2, "세번째 값");
        hashtable.put(3, "네번째 값");
        System.out.println("HashTable의 크기 = " + hashtable.size());
    }
}

 

다음은 해시테이블이 비었는지를 확인해서 T/F를 리턴하는 isEmpty() 메서드다.

import java.util.Hashtable;

public class Test
{
    public static void main(String[] args)
    {
        Hashtable<Integer, String> hashtable = new Hashtable<>();
        hashtable.put(0, "첫번째 값");
        hashtable.put(1, "두번째 값");
        hashtable.put(2, "세번째 값");
        hashtable.put(3, "네번째 값");
        System.out.println(hashtable.isEmpty());
    }
}

해시테이블 안에 값들이 있으니 println()는 false를 출력한다.

 

다음은 해시테이블 안의 모든 키, 밸류값들을 확인하는 메서드다.

 

import java.util.Hashtable;

public class Test
{
    public static void main(String[] args)
    {
        Hashtable<Integer, String> hashtable = new Hashtable<>();
        hashtable.put(0, "첫번째 값");
        hashtable.put(1, "두번째 값");
        hashtable.put(2, "세번째 값");
        hashtable.put(3, "네번째 값");
        System.out.println("전체 Key 확인 = " + hashtable.keySet());
        System.out.println("전체 Value 확인 = " + hashtable.values());
    }
}

 

이 메서드들을 써도 역순으로 출력되는 것을 확인할 수 있다.

 

다음은 해시테이블에 저장된 하나의 키에 매핑된 value를 바꾸는 메서드다.

 

import java.util.Hashtable;

public class Test
{
    public static void main(String[] args)
    {
        Hashtable<Integer, String> hashtable = new Hashtable<>();
        hashtable.put(0, "첫번째 값");
        hashtable.put(1, "두번째 값");
        hashtable.put(2, "세번째 값");
        hashtable.put(3, "네번째 값");
        System.out.println(hashtable.getOrDefault(0, ""));
        hashtable.replace(0, "수정된 첫번째 값");
        System.out.println(hashtable.getOrDefault(0, ""));
    }
}

 

0이란 키에는 첫번째 값이란 문자열이 매핑돼 있었지만, replace()로 키 0에 매핑된 값을 "수정된 첫번째 값"으로 바꾼 뒤, 0을 다시 출력하니 value가 바뀌어 있는 걸 볼 수 있다.

 

해시테이블의 크기는 ArrayList와 마찬가지로 size()로 구할 수 있다.

해시테이블의 값 중 하나의 값을 삭제하는 건 remove()로, 모든 값을 삭제하는 것 또한 ArrayList와 마찬가지로 clear()로 수행할 수 있다.

단 해시테이블은 선언할 때부터 제네릭 안에 2개의 타입을 넣어주기 때문에 remove()는 2가지 형태로 사용할 수 있다.

 

import java.util.Hashtable;

public class Test
{
    public static void main(String[] args)
    {
        Hashtable<Integer, String> hashtable = new Hashtable<>();
        hashtable.put(0, "첫번째 값");
        hashtable.put(1, "두번째 값");
        hashtable.put(2, "세번째 값");
        hashtable.put(3, "네번째 값");
        hashtable.remove(2);
        hashtable.remove(3, "네번째 값");
        System.out.println(hashtable);
    }
}

remove()의 인자로 키만 넣어주거나, 키와 밸류를 모두 넣는 것 중 선택해서 해시테이블 안의 값을 삭제할 수 있다.

이 코드를 실행하면 아래의 결과가 나온다.

 

 

반응형
Comments