(4) 알아두면 유용한 클래스4

[Study]

출처 : http://www.freejava.wo.to/ 저작자(프리맨)

-HashTable Class-

지난 강좌에 배웠던 Vector 클래스는 어떻게 좀 이해가 되시나요? ^^ 메소드를 응용한 프로그램들을 많이 만들다 보면 그냥 책을 읽는 것보다는 훨씬 더 이해가 빠를것입니다. 그러니 여러가지 예제소스를 직접 만들어서 실행해 보세요.

에러가 난다고 두려워 마시고 그 에러를 많이 내고 또한 많이 잡아야지 실력이 향상되는 것입니다.
그러니 열심히 하시기를 다시 한번 기원해보며 이번 강좌를 진행하겠습니다.


- Hashtable Class

이번 강좌에서 배우게될 유용한 클래스는 Hashtable 클래스 입니다. 이 클래스는 지난 강좌에서 보았던 Vector마찬가지로 데이터를 저장할수 있는 클래스 입니다. , 조금 다른 점이 하나 있는데 Vector 저장 객체 같은 경우는 데이터만 저장하는 거고 Hashtable 클래스는 데이터만 저장하기 보다는 보통 keykey에 따른 value값을 저장할수 있습니다. 무슨 말인고 하니 자료를 쌍으로 받는다는 거죠. 좀 더 자세히 설명드리자면 "test" 라는 String형 데이터가 있다고 치면 Vector 저장 객체는 단지 "test"라는 것만 저장을 시키는데 반해 Hashtable 클래스는 "test" 라는 것과 또 다른 값을 동시에 집어 넣을 수 있습니다.

"test" key 값이 되면 그에 따른 또 다른 value값을 넣어 줄 수 있고
"test" value 값이 되면 그에 따른 또 다른 key값을 넣어 줄 수 있는 것입니다.

그런데 이게 무슨 장점이 있을까요? 하하 장점이 벌써 뭔지 아시겠다고요. ~ 모르는 사람들을 위해서 조용히 하시길...^^

예 그겁니다. Hashtable key key에 따른 value값을 집어 넣을 수 있기 때문에 key 값으로 내가 원하는 데이터를 추출해 낼수 있는 것이죠. 한마디로 key를 이름으로 생각하면 이름만 알면 내가 집어 넣은 값을 손쉽게 얻어 낼 수 있다는 것입니다. 손쉽게 데이터에 이름표를 붙였다고 생각하십시요. (자료에 이름표를 달자~~)


이것은 보통 자주쓰는 String형이나 기본타입의 자료형에는 그리 유용해 보이지 않을지 모르지만 만약, 우리가
자바의 특성에 따라 클래스나 객체를 자료형으로 삼아 데이터를 넣었을 경우에는 아주 유용하게 사용할 수 있습니다.

한번 생각해 보세요. 만약 Vector 저장 객체를 Hashtable 클래스에 넣게 된다면(당근 key를 주겠죠.)어떤식으로 이용되는지 조금은 머리속에 떠오르시나요 그럼 좀 더 자세한 것을 알아보겠습니다. Hashtable 클래스를 인스턴스화 할때 사용되는 생성자는 모두 4가지가 있지만 그중 자주 사용되는 것은 2가지 입니다.

Hashtable()

Constructs a new, empty hashtable with a default capacity and load factor, which is 0.75.

(기본 용량 및 로드 인자를 가진 빈 신규 해시테이블을 구성합니다.)

Hashtable(int initialCapacity)

Constructs a new, empty hashtable with the specified initial capacity and

default load factor, which is 0.75.

(지정된 초기 용량에 기본 로드 인자를 가진 빈 신규 해시테이블을 구성합니다. )

그냥 기본값으로 HashTable 클래스를 생성하는 생성자가 하나 있고 int 형으로 초기능력치(initialCapacity)인자로 받아 HashTable 클래스를 생성하는 생성자가 있습니다. 이것외에도 2개의 생성자가 더 있지만 자주 사용되지 않고 또한 초보에게는 지금 본 2개만으로 충분하기에 다루지 않겠습니다. (그래도 API를 보고 있는지는 확인해봐야겠죠.)

이렇듯 생성자를 이용 Hashtable 클래스의 인스턴스를 생성하고 난후 이제부터 알아볼것은 사용되어질 메소드입니다.

void

clear()
           Clears this hashtable so that it contains no keys.
           (
키가 들어있지 않도록 해시테이블을 지웁니다.)

boolean

containsKey(Object key)
           Tests if the specified object is a key in this hashtable.
           (
지정된 객체가 해시테이블에 있는 키인 지를 테스트합니다.)

boolean

containsValue(Object value)
           Returns true if this Hashtable maps one or more keys to this value.
           (
지정된 객체가 해시테이블에 있는 값인 지를 테스트합니다.)

Enumeration

elements()
           Returns an enumeration of the values in this hashtable.
           (
해시테이블에서의 열거(enumeration) 리턴합니다.)

Object

get(Object key)
           Returns the value to which the specified key is mapped in this hashtable.
           (
해시테이블에서 지정된 키가 맵핑된 값을 리턴합니다.)

Object

put(Object key, Object value)
           Maps the specified key to the specified value in this hashtable.
           (
지정된 키를 해시테이블에서 지정된 값으로 맵핑합니다.)

Object

remove(Object key)
           Removes the key (and its corresponding value) from this hashtable.
           (
해시테이블에서 ( 해당 ) 제거합니다.)

int

size()
           Returns the number of keys in this hashtable.
           (해시테이블에 있는 키 갯수를 리턴합니다.)





























.... 메소드가 생각보다 없군요. 지금 보시는 메소드들이 Hashtable 클래스를 사용할때 사용되어질 메소드들 입니다.
본래의 API에는 이것보다 훨씬 더 많은 메소드가 있지만 주로 사용되는 메소드와 반드시 알아야할 메소드만 추린겁니다. (이해하시길....^^ 나머지 메소드는 API를 보고 직접 참고하세요. 그것도 실력 향상의 지름길입니다.) 메소드의 설명을 보시고 쉽게 이해가 가지 않으신가요? Vector편의 강좌를 잘들으신 분들은 아마 쉽게 이해할실겁니다. Vector 클래스의 메소드와도 비슷한 메소드가 많이 있죠.

우선 clear()란 메소드는 단어뜻 그대로 '깨끗이' 만드는 메소드입니다. 이것은 결국 remove() 메소드랑 같은 뜻이죠. 바로 Hashtable 클래스에 저장되어 있는 자료를 지우는 행동을 합니다. 이 두 메소드의 차이점은 clear() Hashtable 클래스에 저장되어 있는 모든 자료를 깨끗이 만드는 거고,remove() 메소드는 Object key 값을 받아서 Hashtable 클래스에 저장되어 있는 자료 중에 key값이 같은것이 있나 찾아보고 있을경우 key값이 같은 것만 지우는 행동을 합니다. 즉 일반 삭제와 완전 삭제의 차이죠.

그 다음에 볼 메소드가 containsKey() 메소드입니다. containsKey() 메소드는 Object형으로 key값을 인자로 받아 Hashtable 클래스에 저장되어 있는 key값 중에 인자로 들어온 값이 있나 없나 확인하는 메소드 입니다.당근 containsValue() 메소드는 설명안해도 어떤 메소드인지 아시겠죠.

이제 직접적으로 자료 입,출력에 관계된 메소드를 살펴보면 put() 이라는 메소드가 있습니다. 이 메소드는 Hashtable 클래스에 자료를 저장하는데 key key에 따른 value값 두 값을 동시에 저장 합니다.

그리고 get() 이라는 메소드는 key값을 인자로 받아 위에서 처럼 저장된 자료중에서 key값이 동일한 값의 value값을 Object형으로 리턴해줍니다.이 두개의 put(), get() 메소드가 기본적으로 Hashtable의 자료 입,출력에 관계된 메소드로서 기본적인것 만큼 가장 자주 쓰이는 메소드이니 Hashtable 클래스와 함께 생각해 두시기 바랍니다.마지막으로 size()라는 메소드는 설명안해도 바로 짐작하실테지만 Hashtable 클래스에 얼마나 많은 자료가 저장되어있는가 , 크기를 int형 값으로 반환해주는 메소드입니다.

후후... 제가 제시했던 메소드에 관한 대략적인 설명은 다 보셨습니다. 그리 어렵지 않죠.^^

그럼 소스를 보면서 정확히 어떤식으로 쓰이고 어느때 쓸 수 있는 메소드인가를 님들 스스로 유추해 보시기 바랍니다.

import java.util.*;

public class HashtableTest

{

  Hashtable hash;

  public HashtableTest()

  {

        hash = new Hashtable();

        }

 

  public void inputData(String text[])

  {

     for (int i=0 ; i < text.length ; i++)

     {

       hash.put(""+i,text[i]);

       }

    }

 

  public void printData()

  {

     System.out.println("size() -> " + hash.size());

     HashtableEnumeration(hash);

     System.out.println("get(\"0\") -> " + hash.get("0"));

     System.out.println("remove(\"0\") -> " + hash.remove("0"));

     System.out.println("get(\"0\") -> " + hash.get("0"));

     System.out.println("containsKey(\"2\") -> " + hash.containsKey("2"));

     System.out.println("containsValue(\"test1\") -> " + hash.containsValue("test1"));

     hash.clear();

     System.out.println("clear() and get(1) -> " + hash.get("1"));

    

    }

  public void HashtableEnumeration(Hashtable has)

  {

    Enumeration enu = has.elements();

     while(enu.hasMoreElements() )

     {

        System.out.println("Enumeration -> " + enu.nextElement());

       }

     }

  public static void main(String[] args)

  {

     String[] text = {"test1", "test2", "test3", "test4", "test5"};

     HashtableTest ht = new HashtableTest();

     ht.inputData(text);

     ht.printData();

    

  }

}

size() -> 5

Enumeration -> test5

Enumeration -> test4

Enumeration -> test3

Enumeration -> test2

Enumeration -> test1

get("0") -> test1

remove("0") -> test1

get("0") -> null

containsKey("2") -> true

containsValue("test1") ->false

clear() and get(1) ->null






























































어때요 별로 어렵지 않죠. 제가 이전에 설명드린 메소드의 설명과 소스를 통한 결과를 한번 비교해 보면서 소스를 해석해 보시기 바라겠습니다. 좀 특별한 것은 hash.put(""+i,text[i]);

이 부분인데 ""+i 라고 써준 부분은 int형인 i 값을 String형으로 변환해주기 위해서 입니다.

본래 put()이라는 메소드는 Object형의 데이터를 인자로 받습니다. 그런데 문제는 String형은 자동으로 Object로 형변환이 되는데 int형은 Object형으로 변환되지 않는다는 것 입니다. 그러기 때문에 페인팅을 쓴거죠.(속임수? ^^)

""+i 라는 구문은 스트링형 빈칸에다가 int i값을 추가해 준건데 자바에서는 이때 자동으로 String형으로 형변환을 해줍니다. 즉 아무것도 없는 "" 에다가 i를 추가해 준다는 것은 int i String형으로 자동 형변환 해주는 효과를 얻을 수 있습니다. 그런후에 put() 메소드에 인자로 넣어주는 거죠....^^ 이해가 좀 되시나요?

이렇듯 메소드의 인자의 형은 아주 중요합니다. 세세하게 API를 보시는 눈을 가지시길 바라겠습니다. @,.@

하하....여기까지가 Hashtable 클래스에 관한 짧은 설명이었습니다. 설명은 짧지만 Hahtable은 사용빈도가 상당히 많은

클래스 입니다. Vector와 함께 자주 쓰이며 프로그래밍 할때 상당히 사용이 편리합니다. 그러니 제가 올려드린 메소드이외에 API를 보면서 더 많은 것을 보시기 바라겠습니다. ^^ 에궁...힘들게 또 한강좌가 끝났습니다....

이번 강좌도 끝!!!! 파이팅!!!!

2006/12/13 16:37 2006/12/13 16:37
TAG.

이 글의 트랙백 주소 :: 이 글에는 트랙백을 보낼 수 없습니다

::: 사람과 사람의 교감! 人터넷의 첫 시작! 댓글을 달아주세요! :::