2010. 7. 7. 16:39

자바(Java) 배열(Array), 해쉬테이블(Hashtable), 그리고 벡터(Vector)

배열은 크기가 같은 데이타가 연속적으로 저장되어 있는 변수들의 집합으로 같은 형태의 자료들을 대량처리 할때 유용하다. 그 일례가 바로 학생들의 성적처리이다. 한 30명쯤 되는 학생들의 국어시험 성적을 배열로 쓰면 편리하다.

C언어로 할것 같으면 배열선언이 간단한데 int kor_exam[30] ; 으로 하면 된다. 특히 C언어에는 '문자열'이라는 데이타형이 없다. 처음엔 좀 황당할 수 있는 점이지만, 어쨌든 이것을 문자 데이타형의 배열로 써야 한다. 즉, 10자가 들어가는 문자열 데이타를 선언하려면, char my_string[10] ; 이라고 해야 한다.

자바에서는 String타입이라는 문자열 데이타형이 있다. 자바에서 배열은 C언어와는 다른 개념으로 선언된다. 왜냐하면, 너무나도 당연히(?) 자바는 모두 `객체지향`방식이기 때문이다.

자바로 위 경우를 선언할려면 int[] korExam = new int[30] ; 의 식으로 객체의 인스턴스를 생성한다. 즉, 배열도 객체로 선언한다는 것이다. int korExam[] = new int[30] ; 으로 써도 되나 int[] korExam이 더 자바의 객체지향 개념에 충실한 것이다.

그리고, 이러한 배열의 접근은 해당 배열 요소 즉 index개념으로 하므로 10번째 학생의 국어 점수에 대한 접근은 korExam[9]가 된다. 배열은 0부터 시작함을 유의해야 한다.

해쉬 테이블(Hash Table)은 배열처럼 여러 개의 데이타를 저장하는 자료구조이다. 배열과 가장 큰 차이점은 크기가 고정되어 있지 않고 가변적이라는 것과 인덱스를 통한 접근이 아니라 일종의 키값을 이용해 특정 위치에 접근한다는 점이다.

키값을 이용하면 자료의 수 즉, 테이블의 크기와는 상관없이 원하는 자료가 있는 위치로 한 번에 갈 수 있다는 장점이 있다. 해쉬 테이블의 용법을 한번 살펴보자.

Hashtable ht = new Hashtable() ;  // 해쉬테이블 객체를 만든다.
ht.put("A1", new Integer(94)) ;
ht.put("A2", new Integer(82)) ;
ht.put("A3", new Integer(87)) ;
.
.
.
System.out.println("A1 = " + (Integer)ht.get("A1")) ;
put() 으로 값을 넣고 get()으로 값을 가져온다. 여기서, A1은 키값이고, 다른 하나는 실제 데이타가 된다. 즉 실제 데이타가 특정한 키값을 꼬리표로 가지고 저장되므로 키값을 사용하여 데이타를 다룰 수 있게 되는 것이다.

그런데, 주의할 점은 Hashtable에 저장되는 키값과 데이타는 반드시 `객체`라야 한다. 그래서, 직접 데이타 수치를 넣을 수가 없으므로 Integer(수치)의 형식으로 정수를 저장했고, 이를 자바에서는 'Wrapper 클래스를 사용한다'라고 한다. 출력문의 (Integer)는 `캐스팅(casting)`이다.

마지막으로 Vector는 인덱스로 객체의 위치를 판별하기 때문에 배열과 유사하다. 그러나 이 역시 크기가 가변적이어서 크기가 다른 모든 종류의 객체를 저장할 수 있기 때문에 배열보다 더욱 융통성이 있다. 실제로도 아주 많이 쓰이며, 유용하다.

하지만, 배열, 해쉬테이블, 벡터 이 셋 중에서 어떤 것이 좋다 아니다라는 것은 없다. 각각이 모두 다 적합하게 쓰일 데가 있고, 그것은 프로그램을 만드는 사람의 선택이다. 벡터는 `Collection` 인터페이스에 속해있으며 여기에는 벡터 외에도 ArratList, Stack, LinkedList, HashSet, TreeSet 등의 클래스들과 같은 자료구조들이 다양하게 마련되어 있다.

아래 벡터의 용법은 DB에 저장되어 있는 여러 도서관련 데이타들을 rs를 통해 DB에서 가져와 `bookBean`이라는 `자바 빈(Bean)`에 setter로 모두 넣고, 이것들을 한꺼번에 담아온 vector의 데이타를 getter로 하나씩 받아 출력한다.

Vector<Object> vector = new Vector<Object>() ;   //벡터 객체를 생성한다.
bookBean.setBookTitle(rs.getString(bookTitle)) ; //도서명
bookBean.setBookAuthor(rs.getString(bookAuthor)) ;
bookBean.setBookPublish(rs.getString(bookPublish)) ;
bookBean.setBookPrice(rs.getString(bookPrice)) ;
.
.
.
vector.add(bookBean) ; //bookBean에 담겨진 데이타 모두를 벡터에 담는다.
.
.
return vector ; //벡터를 반환한다.
//벡터의 값들을 출력할려면 다음과 같다.
for (int i = 0 ; i < vector.size() ; i++) {
    BookBean bookBean = (BookBean)vector.get(i) ;
    //자바는 이렇게 변수에 직접 접근할 수 없고, 해당 객체에 '물어서' 값을 가져온다.
    bookTitle = bookBean.getBookTitle() ;                   
    System.out.println("도서명 : " + bookTitle) ;
    .
    .
    .
}