본문 바로가기

IT 서비스 바라보기/Programming

Vector와 Hash Table




Vector와 Hashtable은 내부적으로 Collection인터페이스를 사용하고 있는 대표적인 놈입니다. Vector는 Collection자체를 바로 구현한 클래스이며, Hashtable은 내부적으로 Collection을 사용하고 있습니다. 객체를 저장할 수 있다는 면에서는 이 두 클래스는 비슷하지만 내부적인 구현과 약간의 사용방법이 다릅니다.

 

Hashtable의 특성을 본다면 단연코 유일한 키값을 가지고 있다는 것입니다. 이 말은 객체를 삽입할 때 특별한 키값을 같이 입력하고, 그리고 객체를 추출할 때에는 키값으로 객체를 추출하는 기법을 사용 할 수 있다는 것입니다. 즉, 객체를 저장할 때 꼬리표를 하나 붙여 두는 것이지요. 그리고 이 꼬리표를 이용해서 객체를 다시 얻어오는 것입니다. 꼬리표 또한 객체의 형식을 사용하고 있습니다. 보통의 꼬리표(키값)는 스트링형을 사용합니다.

 

Vector의 경우에는 이와는 달리 객체만을 삽입하고 객체를 순서대로 추출하는 기법을 사용합니다. 단순한 저장공간으로만 사용하는 것입니다. 벡터와 해시테이블의 차이점을 정리하면 다음과 같습니다.

 

벡터와 해시테이블의 차이점

n        벡터: 데이터의 입력한 순서에 따라서 데이터 추출, index로 추출

n        해시테이블: 키값과 데이터를 같이 입력하고 키값으로 데이터를 추출할 수 있다.

n        물론, 해시테이블은 벡터의 기능을 그대로 가지고 있다.

 

그럼 Vector 의 초 간단 예제를 한번 살펴 볼까요

 

VectorTest.java

import java.util.Vector;

public class VectorTest {

   public static void main(String[] args) {

                           Vector v = new Vector();

                           System.out.println("생성직후의 size: " + v.size());

                           //1. 벡터객체에 데이터4개 삽입

                           v.addElement(new String("망아지"));

                           v.addElement(new String("송아지"));

                           v.addElement(new String("강아지"));

                           v.addElement(new String("병아리"));

                           System.out.println("데이터 삽입후의 size: " + v.size());

                           //2. Vector의 요소 가져오기

                           for(int i=0; i< v.size(); i++){

                                        String temp = (String)v.elementAt(i);

                                        System.out.println("벡터의 " + i + "번째:" + temp);

                           }

   }

}

C:\examples\6. Array>javac VectorTest.java

 

C:\examples\6. Array>java VectorTest

생성직후의 size: 0

데이터 삽입후의 size: 4

벡터의 0번째:망아지

벡터의 1번째:송아지

벡터의 2번째:강아지

벡터의 3번째:병아리

 

 일단 Vector객체를 하나 생성합니다.

 

n        Vector v = new Vector();

 

그리고 Vector v에 스트링 객체 4개를 삽입합니다. 데이터를 삽입할 때는 addElement(Object obj)메서드를 이용합니다. 그리고 매개변수는 객체의 형식을 이용합니다.

 

n        v.addElement(new String("망아지"));

n        v.addElement(new String("송아지"));

n        v.addElement(new String("강아지"));

n        v.addElement(new String("병아리"));

 

넣었다면 다시 뽑아서 보아야죠. 객체의 삽입된 순서에 따라서 다시 데이터를 추출합니다.

 

n        for(int i=0; i< v.size(); i++){

n         String temp = (String)v.elementAt(i);

n         System.out.println("벡터의 " + i + "번째:" + temp);

n        }

 

벡터 내에 있는 객체의 수는 size()메서드를 이용하여 얻을 수 있습니다. 그 수만큼 elementAt메서드를 이용하여 index순으로 차례대로 데이터를 추출합니다. 하지만 추출된 데이터는 Object형이기 때문에 원래의 형으로 형변환을 해 주어야 합니다.

 

n         String temp = (String)v.elementAt(i);

 

위의 예에서 Vector를 처음 생성했을 때 size는 0입니다. 그리고 데이터를 4개 삽입했을 때의 개수는 4입니다. 이 단순한 소스는 벡터라는 것이 무엇을 하는 것인지 정확하게 보여주고 있습니다. 벡터를 보다 다양하게 이용하고 있는 예제를 하나 살펴보도록 하겠습니다.

 

VectorTest2.java

import java.util.Vector;

 

public class VectorTest2 {

   public static void main(String[] args) {

      Vector v = new Vector();

      //벡터객체에 데이터 삽입

      v.addElement(new Character('A'));

      v.addElement(new String("굼뱅이"));

      v.addElement(new Integer(100));

      v.addElement(new Integer(200));

v.insertElementAt(new Float(3.141592), 1); //1번째에 중간삽입

      v.setElementAt(new String("Set"), 3); //3번째존재하는 것 제거후 다시 삽입(update)

 

      System.out.println("size: " + v.size());

     

  System.out.println("벡터의0번째:" + (Character)v.elementAt(0));

      System.out.println("벡터의1번째:" + (Float)v.elementAt(1));

      System.out.println("벡터의2번째:" + (String)v.elementAt(2));

      System.out.println("벡터의3번째:" + (String)v.elementAt(3));

      System.out.println("벡터의4번째:" + ((Integer)v.elementAt(4)).toString());

 

      if(v.contains(new String("Set"))){

         Integer integer = new Integer(v.indexOf("Set"));

         System.out.println("Index of String(\"Set\"): " + integer.toString());

      }

   }

}

C:\examples\6. Array>javac VectorTest2.java

 

C:\examples\6. Array>java VectorTest2

size: 5

벡터의0번째:A

벡터의1번째:3.141592

벡터의2번째:굼뱅이

벡터의3번째:Set

벡터의4번째:200

Index of String("Set"): 3

 

이 프로그램의 절차는 다음과 같습니다.

 

n         벡터를 생성한다.

             Vector v = new Vector();

n         벡터에 4개의 객체를 삽입한다.

             v.addElement(new Character('A'));

             v.addElement(new String("굼뱅이"));

             v.addElement(new Integer(100));

             v.addElement(new Integer(200));

n         벡터의 1번째 자리에 객체를 삽입한다.

             v.insertElementAt(new Float(3.141592), 1); //1번째에 중간삽입

n         벡터의 3번째 자리의 것을 지우고 다른 객체로 업데이트한다.

             v.setElementAt(new String("Set"), 3); //3번째존재하는 것 제거후 다시 삽입(update)

n         벡터의 데이터를 모두 얻어내어 원래의 형으로 변환하여 출력한다.

             System.out.println("벡터의0번째:" + (Character)v.elementAt(0));

             System.out.println("벡터의1번째:" + (Float)v.elementAt(1));

             System.out.println("벡터의2번째:" + (String)v.elementAt(2));

             System.out.println("벡터의3번째:" + (String)v.elementAt(3));

             System.out.println("벡터의4번째:" + ((Integer)v.elementAt(4)).toString());

n         벡터에 특정객체가 있는지 확인한다.

             v.contains(new String("Set")) 있다면 true 없다면 false

n         벡터에 찾고자하는 객체를 이용하여 해당객체를 벡터에서 찾는다.

             v.indexOf("Set"));

 

벡터에서 사용할 수 있는 여러가지 메서드의 사용방법을 보여주고 있습니다. 다음으로 Hashtable의 예를 살펴보도록 하겠습니다.

 

HashtableTest.java

import java.util.Hashtable;

public class HashtableTest {

             public static void main(String[] args) {

             Hashtable h = new Hashtable();

             //1. 해시테이블에 객체의 삽입

             h.put("Name", new String("홍길동"));

             h.put("Age", new Integer(27));

             h.put("Tel", new String("02-1111-2222"));

             h.put("Handphone", new String("017-777-9999"));

             h.put("Etc", new String("I'm a boy"));

             //키값을 이용하여 객체 추출

             String name = (String)h.get("Name");

             if (name != null) {

                           System.out.println("Name = " + name);

             }

             Integer age = (Integer)h.get("Age");

             if (age != null) {

                           System.out.println("Age = " + age.intValue());

             }

   }

}

C:\examples\6. Array>javac HashtableTest.java

C:\examples\6. Array>java HashtableTest

Name = 홍길동

Age = 27

 

해시테이블은 독특하게 키값과 객체를 함께 주어 키값으로 객체를 추출할 수 있습니다. 일단, 제일 먼저 Hashtable객체를 생성하는 것을 볼 수 있습니다.

 

n         Hashtable h = new Hashtable();

 

해시테이블에 키값과 객체를 동시에 주면서 객체 5개를 삽입하고 있습니다. 이 때 삽입하는 원리는 Vector에 데이터를 삽입하는 것과 같이 Upcasting의 원리를 이용해서 데이터를 삽입하고 있습니다. 매개변수는 Object형이기 때문에 String형과 Integer형 객체 모두 put의 매개변수로 사용할 수 있는 것입니다. 이것의 장점은 객체가 어떠한 형인지 몰라도 객체를 삽입할 수 있다는 것입니다. 이렇게 생각해 보죠. Hashtable을 만든 사람은 실행시에 사용자가 어떤 객체를 넣을 것이라고 가정할까요? 모를 일이죠. 즉, 실행시에 어떠한 객체가 입력될지 몰라도 Upcasting을 이용하면 모두 받아 들일 수 있다는 원리를 이용한 것입니다. 다음은 Hashtable에 객체를 삽입하는 것을 보여 주고 있습니다.

 

n         h.put("Name", new String("홍길동"));

n         h.put("Age", new Integer(27));

n         h.put("Tel", new String("02-1111-2222"));

n         h.put("Handphone", new String("017-777-9999"));

n         h.put("Etc", new String("I'm a boy"));

 

다음은 키값을 이용해서 객체를 받아 내어서 출력합니다. 입력시 내부에서 Object형으로 형변환을 하기 때문에 리턴형은 Object형입니다. Downcasting을 통해서 다시 원래의 형으로 복원합니다. 다음은 Hashtable에서 객체를 얻어 원래의 형으로 복원 시키고 있는 것을 보여주고 있습니다.

 

n        String name = (String)h.get("Name");

n        Integer age = (Integer)h.get("Age");

 

지금까지 여러분은 내부적으로 Collection을 사용하는 Vector와 Hashtable의 사용법에 대해서 알아 보았습니다. 다음 절에서는 열거자를 이용한 Hashtable 과 Vector를 다루는 방법에 대해서 알아 보도록 하겠습니다.

 

출처: www.jabook.org