C#

[C#]Hashtable 사용 방법

DevStory 2022. 1. 12.

Hashtable이란?

C#의 Hashtable은 "Key-Value" 구조를 가지는 컬렉션입니다.

 

키(Key)는 데이터를 식별하기 위해 필요한 정보를 가지며, Hashtable에서 키는 모든 데이터 타입이 될 수 있습니다. 값(Value)은 키에 매핑되는 데이터입니다.

 

이번 포스팅에서는 Hashtable의 필요성과 사용 방법을 소개합니다.

 


Array와 ArrayList의 문제점

Array 또는 ArrayList의 인덱스를 사용하여 "Key-Value" 구조를 만들 수 있습니다. 인덱스 위치를 Key라는 개념으로 접근하여 값을 설정하는 방법입니다. 하지만, 이 방법은 개발자가 인덱스 위치가 어떤 데이터를 가져오는지 기억해야 하므로 상당히 비효율적입니다.

 

다음 예제는 이름, 나이, 주소, 이메일 정보를 ArrayList로 관리하며, ArrayList로 Key-Value 구조를 만드는 것이 비효율적이라는 것을 증명합니다. 

class Program
{
    static void Main(string[] args)
    {
        ArrayList userInfo = new ArrayList();

        userInfo.Add("홍길동");
        userInfo.Add(20);
        userInfo.Add("서울특별시 강서구...");
        userInfo.Add("Hong@Test.com");

        // 이름을 알고 싶은 경우
        Console.WriteLine("이름 : " + userInfo[0]);

        // 이메일을 알고 싶은 경우
        Console.WriteLine("이메일 : " + userInfo[3]);
    }
}

위 예제는 이름은 0번째 인덱스, 나이는 1번째 인덱스, 주소는 2번째 인덱스, 이메일은 3번째 인덱스로 설정하였습니다. 이름을 알고 싶은 경우 userInfo의 0번째 인덱스를 접근해야 하며, 이메일을 알고 싶은 경우 3번째 인덱스를 접근해야 합니다.

 

ArrayList의 요소가 추가될 때마다 개발자는 인덱스 위치를 기억하여 데이터를 접근해야 하는데, 이러한 방법은 굉장히 비효율적입니다.


Hashtable 사용 방법

Hashtable은 "Key-Value" 구조로 키를 사용하여 데이터를 접근할 수 있습니다. Hashtable은 각 키에 대해 해시 코드를 계산하므로 데이터 접근 성능을 향상합니다.

 

다음은 ArrayList로 구현한 예제를 Hashtable로 변경한 예제입니다.

class Program
{
    static void Main(string[] args)
    {
        Hashtable userInfo = new Hashtable();

        // 첫 번째 인자는 Key
        // 두 번째 인자는 Value
        userInfo.Add("name", "홍길동");
        userInfo.Add("age", 20);
        userInfo.Add("address", "서울특별시 강서구...");
        userInfo.Add("email", "Hong@Test.com");

        // 이름을 알고 싶은 경우
        Console.WriteLine("이름 : " + userInfo["name"]);

        // 이메일을 알고 싶은 경우
        Console.WriteLine("이메일 : " + userInfo["email"]);
    }
}

new Hashtable()로 Hashtable 객체를 생성하며, Add() 함수로 키와 값을 추가합니다. Add() 함수의 첫 번째 인자로 키를 전달하며, 두 번째 인자로 키와 매핑되는 값을 전달합니다. 값을 알고 싶은 경우 대괄호 사이에 키를 작성하여 값을 접근합니다.

 

만약, 동일한 키를 중복해서 설정하면, 다음 예제처럼 예외가 발생합니다.

class Program
{
    static void Main(string[] args)
    {
        Hashtable userInfo = new Hashtable();

        userInfo.Add("name", "홍길동");
        userInfo.Add("name", "둘리");
    }
}

실행 결과

키는 값을 식별하기 위해 사용되는 고유한 값이므로 Hashtable의 객체는 동일한 키를 가질 수 없습니다.

 

Hashtable 객체를 반복문을 사용하여 값을 접근하는 경우 foreach() 문을 사용할 수 있습니다.

class Program
{
    static void Main(string[] args)
    {
        Hashtable userInfo = new Hashtable();

        userInfo.Add("name", "홍길동");
        userInfo.Add("age", 20);
        userInfo.Add("address", "서울특별시 강서구...");
        userInfo.Add("email", "Hong@Test.com");
		
        foreach(object key in userInfo.Keys)
        {
            Console.WriteLine("Value : " + userInfo[key]);
        }
    }
}

실행 결과

위 예제처럼 foreach() 문으로 Hashtable 객체의 키를 순차적으로 접근할 수 있습니다. 키는 모든 데이터 타입이 될 수 있으므로 Object 타입으로 접근합니다.

 

Hashtable 객체에서 특정 키를 가지는 요소를 제거하고 싶은 경우 Remove() 함수에 키를 전달합니다.

class Program
{
    static void Main(string[] args)
    {
        Hashtable userInfo = new Hashtable();

        userInfo.Add("name", "홍길동");
        userInfo.Add("age", 20);
        userInfo.Add("address", "서울특별시 강서구...");
        userInfo.Add("email", "Hong@Test.com");
		
        userInfo.Remove("address");
        userInfo.Remove("email");
            
        foreach(object key in userInfo.Keys)
        {
            Console.WriteLine("Value : " + userInfo[key]);
        }
    }
}

실행 결과


Hashtable 객체에서 특정 키와 값이 존재하는지 체크

Hashtable에서 특정 키가 존재하는지 또는 특정 값이 존재하는지 체크해야 하는 경우가 있습니다.

 

키를 체크하는 경우 ContainsKey() 함수를 사용하며, 값을 체크하는 경우 ContainsValue() 함수를 사용합니다. 두 함수는 키 또는 값이 존재하면 true를 반환하며 그렇지 않으면 false를 반환합니다.

 

다음은 ContainsKey() 함수와 ContainsValue() 함수 사용 예제입니다.

class Program
{
    static void Main(string[] args)
    {
        Hashtable userInfo = new Hashtable();

        userInfo.Add("name", "홍길동");
        userInfo.Add("age", 20);
        userInfo.Add("address", "서울특별시 강서구...");
        userInfo.Add("email", "Hong@Test.com");

        // ContainsKey() 함수 사용
        Console.WriteLine("name이라는 키가 존재하는가? : " + userInfo.ContainsKey("name"));
        Console.WriteLine("gender라는 키가 존재하는가? : " + userInfo.ContainsKey("gender"));
        
        // ContainsValue() 함수 사용
        Console.WriteLine("20이라는 값이 존재하는가? : " + userInfo.ContainsValue(20));
        Console.WriteLine("man이라는 값이 존재하는가? : " + userInfo.ContainsValue("man"));
    }
}

실행 결과

반응형

'C#' 카테고리의 다른 글

[C#]인덱서 사용 방법  (0) 2022.01.17
[C#]열거형 사용 방법  (0) 2022.01.17
[C#]콘솔(Console) 입력 및 출력  (0) 2022.01.09
[C#]ToString 재정의  (0) 2022.01.09
[C#]Equals 재정의  (0) 2022.01.09

댓글