7.9 Hashtable 클래스
Hashtable 클래스가 ICollection을 구현하는 것은 아주 당연한 것입니다. 그리고, Hashtable의 가장 큰 특징은 바로 IDictionary를 구현하고 있다는 것입니다. 물론, 앞에서 살펴본 것과 같이 IDictionary는 ICollection을 상속받았기 때문에 컬렉션류의 대부분의 기능을 전부 구현하였다고 볼 수 있습니다. IDictionary의 대표 기능은 바로 데이터를 삽입하고 추출할 때 키(Key)와 값(Value)를 이용한다는 것입니다. IDictionary의 대표적인 예가 바로 Hashtable입니다.
▣ Hashtable 클래스의 프로토타입 |
public class Hashtable : IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback, ICloneable |
Hashtable은 빠른 검색을 목적으로 최적화된 IDictionary(사전) 구조로 되어 있습니다. 그리고, Hashtable은 IEnumerable 인터페이스 또한 구현하고 있기 때문에 사전식 검색뿐만 아니라 각각의 요소의 나열에도 아주 편리한 기능을 제공해 주고 있습니다.
▣ 해시테이블(Hashtable) |
□ IDictionary 인터페이스의 대표적인 예
□ 객체를 삽입할 때 특별한 키(Key)와 값(Value)을 같이 입력해야 한다. |
▣ Hashtable 클래스의 메서드 |
□ Add()
· 특정 키(Key)와 값(Value)을 가진 원소를 추가
□ Clear()
· Hashtable 안에 있는 모든 객체를 제거
□ ContainsKey()
· Hashtable에 어떤 특정 키가 존재하는지 알려준다.
□ ContainsValue()
· Hashtblae에 어떤 특정 값이 들어 있는지 여부를 확인
□ CopyTo()
· Hashtable에 있는 원소를 이미 존재하는 1차원 배열로 복사
□ GetEnumerator()
· Hashtable을 위한 열거자(Enumerator)를 반환
□ Remove()
· 특정 Key와 관련 있는 원소를 삭제 |
다음 예에서 Hashtable 클래스의 메서드를 통해서 객체의 저장, 검색, 특정값 검색, 삭제하는 것을 알아보겠습니다.
& |
SamplesHashtable.cs |
Ü Hashtable을 테스트하는 예제 |
using System; using System.Collections;
public class SamplesHashtable { public static void Main() { Hashtable myHT = new Hashtable(); myHT.Add("First", "Hello"); myHT.Add("Second", "World"); myHT.Add("Third", "welcome"); myHT.Add("Four", "!"); Print("1. myHT 전체목록:", myHT);
bool IsContain= myHT.ContainsKey("First"); Console.WriteLine("2. First 키의 존재여부:" + IsContain); Console.Write("3. 키값들만 출력\n\t");
ICollection mykey = myHT.Keys; foreach(object obj in mykey) Console.Write( "{0},", obj);
Console.WriteLine(); Console.Write("4. Value들만 출력\n\t");
ICollection myval = myHT.Values; foreach(object obj in myval) Console.Write( "{0},", obj); Console.WriteLine(); myHT.Remove("Four");Print("5. 데이터삭제:", myHT); } //main
public static void Print( String info, Hashtable myList ) { IDictionaryEnumerator myEnumerator = myList.GetEnumerator(); Console.Write(info + "\n\t"); while ( myEnumerator.MoveNext() ) Console.Write("{0}:{1}, ", myEnumerator.Key, myEnumerator.Value); Console.Write(" 요소의 갯수:" + myList.Count + "\n"); } } //class |
C:\C#Example\07>csc SamplesHashtable.cs
C:\C#Example\07>SamplesHashtable
1. myHT 전체목록:
Third:welcome, Second:World, Four:!, First:Hello, 요소의 갯수:4
2. First 키의 존재여부:True
3. 키값들만 출력
Third,Second,Four,First,
4. Value들만 출력
welcome,World,!,Hello,
5. 데이터삭제:
Third:welcome, Second:World, First:Hello, 요소의 갯수:3 |
먼저, Hashtable 클래스 객체를 생성한 후 4개의 객체를 삽입하고 있습니다. 이 때 사용되는 메서드는 Add()이며 Add() 메서드의 첫번째 매개변수는 키(Key)로 이용되며 두번째 매개변수는 값(Value)으로 이용됩니다.
Hashtable myHT = new Hashtable(); //해시테이블의 생성
myHT.Add("First", "Hello");
myHT.Add("Second", "World");
myHT.Add("Third", "welcome");
myHT.Add("Four", "!");
Hashtable 클래스 내에 존재하는 특정 키(Key)를 포함하고 있는지 확인하기 위해서 ContainsKey() 메서드를 이용합니다. 해당 키가 있을 때는 true를 아니면 false를 반환합니다.
bool IsContain= myHT.ContainsKey("First");
Hashtable에서 키(Key)나 값(Value)을 ICollection 형태로 얻어내기 위해서는 Keys나 Values 속성을 이용합니다. 이 때 반환되는 속성의 형은 ICollection이기 때문에 foreach를 구현하여 데이터를 추출해 볼 수 있습니다.
ICollection mykey = myHT.Keys; //Hastatable의 키(Key) 얻기
foreach(object obj in mykey)
Console.Write( "{0},", obj);
ICollection myval = myHT.Values; //Hashtable의 값(Value) 얻기
foreach(object obj in myval)
Console.Write( "{0},", obj);
데이터를 삭제할 때에는 Remove() 메서드를 이용합니다. 다음은 Hashtable 내에서 키가 "Four"인 것을 삭제하게 됩니다.
myHT.Remove("Four")
Hashtable에서 모든 데이터를 검색할 때는 속성이나 IEnumerator를 이용하는 것 보다 오히려 IEnumerator와 IDictionary 성질을 동시에 지니고 있는 IDictionaryEnumerator 인터페이스를 이용합니다. 이 때 Hashtable의 GetEnumerator() 메서드를 통해서 IDictionaryEnumerator 객체를 얻어 냅니다.
IDictionaryEnumerator myEnumerator = myHT.GetEnumerator();
while ( myEnumerator.MoveNext() )
Console.WriteLine("\t{0}:\t{1}", myEnumerator.Key , myEnumerator.Value ); |