출처 : http://www.freejava.wo.to/ 저작자(프리맨)
-Vector Class-
지난 강좌의 StringTokenizer 클래스는 연습을 통해 확실하게 사용할 수 있게 되었나요 (아니라구요...--;) 이번 강좌는 Enumeration 인터페이스를 구현한 Vector 저장객체에 대해서 알아 보려고 합니다.이번에 배우게 될 Vector 저장객체는 가장 많이 쓰이는 클래스중 하나이기 때문에 세심히 봐두시기 바랍니다. 그럼 이번 강좌도 시작해볼까요.....^^
- Vector Class
지난 강좌에 Enumeration 인터페이스 얘기가 나왔으니까 데이터를 저장할수 있는 저장 객체에 대해 좀 더 얘기해 보는 시간을 갖도록 하죠. 그래서 이번에 보실것이 Vector라는 객체입니다. 이 Vector라는 객체는 크기가 가변적인 저장객체입니다. 좀 더 자세히 설명하자면 Vector는 클래스이긴 하지만 저장객체로 사용되고 Object형까지 전부 다 집어 넣을 수 있는데(모든 클래스가 java.lang.Object를 상속하므로 모든 클래스를 다 집어 넣을수 있습니다. ^^ 다 넣어라..) 그 크기가 고정된 것이 아니라 일정 정도의 양이 차면 알아서 여유 공간을 늘려주므로서 크기가 변하는 저장 객체 입니다.
쉽게 생각해서 물을 넣을 수 있는 풍선이라고 생각하시면 됩니다. 물이 저장하려는 데이터고 풍선이 Vector객체인거죠.
처음에 풍선은 아주 작지만 물이 계속 들어오면 들어올수로 풍선도 점점 커지죠 그리고 불행한 얘기이기는 하지만 저장 용량의 한계를 넘어 버리면 '뻥~!', 흐~~~~~~ 쉽게 이해가 되시겠죠....
(하지만 그리 쉽게 Vector 객체가 터지지는 않습니다. 왜냐하면 메모리랑 연관이 있기 때문이죠. ^^)
보통 객체를 생성할 때는 Vector vector = new Vector();
이런 구문처럼 아무 인자도 주지 않고 생성하는데 만약 초기 저장 용량과 용량이 더 필요할때마다 늘어날 용량을 정해줄 필요가 있다면 인자로 넣어주고 Vector vector = new Vector(10, 15); Vector 객체를 생성할 수도 있습니다.
Vector 객체의 특징은 이외에도 elements()메소드를 이용하여 Enumeration의 인스턴스를 반환하기 때문에 Enumeration을 객체로 이용할 수도 있습니다. (원하면 Enumeration의 인스턴스의 메소드들도 사용할 수 있다는 말입니다.) 그리고 Vector 클래스는 데이터를 저장하거나 빼내기 위해 정말 많은 메소드들을 제공해 줍니다. 그것을 살펴보면
void | add(int index, Object element) |
void | addElement(Object obj) |
int | capacity() |
void | clear() |
Object | clone() |
boolean | contains(Object elem) |
Object | elementAt(int index) |
Enumeration | elements() |
Object | firstElement() |
Object | lastElement() |
Object | remove(int index) |
boolean | remove(Object o) |
void | setElementAt(Object obj, int index) |
List | subList(int fromIndex, int toIndex) |
메소드가 너무 많아요..T.T 정말로 엄청나게 많은 메소드인 것 같지만 이거 새발의 피입니다. --; Vector 클래스에 있는 메소드중에 중요한 것만 추린것이거든요. 메소드가 많다는 것은 그만큼 기능이 많다는 것. 이제부터 Vector 클래스에 있는 메소드들의 기능을 알아볼까요.
import java.util.*; public class VectorTest { Vector vector; public VectorTest() { vector = new Vector(); } public void inputData(String text[]) { for (int i=0 ; i < text.length ; i++) { vector.addElement(text[i]); } } public void printData() { System.out.println("capacity() -> " + vector.capacity()); String text = "test2"; System.out.println("contains(text) -> " + vector.contains(text)); System.out.println("elementAt(3) -> " + vector.elementAt(3)); vectorEnumeration(vector); System.out.println("firstElement() -> " + vector.firstElement()); System.out.println("lastElement() -> " + vector.lastElement()); System.out.println("remove(3) -> " + vector.remove(3)); System.out.println("|_elementAt(3) -> " + vector.elementAt(3)); String text2 = "text"; vector.setElementAt(text2,1); System.out.println("setElementAt(text2, 1) and elementAt(1)-> " + vector.elementAt(1)); } public void vectorEnumeration(Vector vec) { Enumeration enu = vec.elements(); while(enu.hasMoreElements() ) { System.out.println("Enumeration -> " + enu.nextElement()); } } public static void main(String[] args) { String[] text = {"test1", "test2", "test3", "test4", "test5"}; VectorTest vt = new VectorTest(); vt.inputData(text); vt.printData(); } } |
음 소스를 보시고 뭔가 팍! 느낌이 오시는것들이 있으시지 않으신가요. 아마 제가 따로 메소드를 설명하지 않더래도 벌써부터 메소드의 기능을 API와 예제 프로그램 소스만으로 이해하신분들도 있으시겠죠. (앞으로 계속 이런식으로 설명을 드릴텐데 초보의 경지에 이렀다는 것은 지금 했던 것처럼 API와 소스만으로도 클래스와 메소드가 어떠한 기능들을 하는지 알게되는 것입니다. 그렇게 되면 기타 다른 책을 봐도 머리속에 팍팍 이해가 되겠죠. 초보의 그 경지를 위하여 열심히 정진하시기를....^^)
잡생각은 이제 그만하고 Vector 클래스의 메소드에 대해 간략하게 설명드리겠습니다. (먼저 예제 프로그램을 꼭 돌려보시기를) Vector는 저장 객체라고 하였습니다. Vector의 가장 기본적인 것은 addElement() 메소드를 이용하여 Vector에 데이터를 집어넣고 elementAt() 메소드나 firstElement(), lastElement() 메소드를 이용해 저장되어 있는 데이터를 빼내는 것입니다.
elementAt() 메소드는 int형으로 index를 받아서 Vector 저장 객체안에 저장되어 있던 데이터의 index(순서)와 일치되는 것을 Object형으로 반환하여 줍니다. 그리고 firstElement()는 제일 처음에 저장되어 있는 데이터를, lastElement()는 마지막에 저장되어 있는 데이터를 반환하여 줍니다.
그런데 만약 님이 데이터를 Vector에다가 저장시켰는데 필요 없다거나 지워야 할때가 있지 않습니까?
그럴때 사용되는게 remove() 메소드로서 index나 저장되어 있는 데이터를 인자로 받아 Vector 저장 객체안의 데이터를 지울수 있습니다. clear()도 Vector 저장 객체안의 데이터를 지울수 있는데 이 메소드는 remove() 처럼 한개의 데이터를 지우는 것이 아니라 Vector 저장 객체안의 모든 데이터를 지우는 메소드입니다.
또한 Vector 저장 객체 안의 데이터를 수정해야할때는 setElementAt() 메소드를 이용해서 인자로 바꾸어줄 데이터와 index 위치를 넣어주시면 님이 원하는 대로 수정을 하실수 있습니다.Vector 저장 객체의 상태를 알아볼수 있는 메소드도 있는데 capacity() 메소드는 Vector 저장 객체의 저장 능력을 반환 합니다. 예제 소스를 실행 시켰을때 5개의 데이터를 집어 넣었는데 메소드의 결과가 10이라서 이해가 안되신 분들도 있을텐데 Vector는 가변적인 저장 객체 이지만 처음 초기값을(기본은 10) 주고 그 이상의 데이터가 들어올 경우에만 자동적으로 저장 능력을 늘려줍니다. 그렇기 때문에 capacity() 메소드의 결과가 10이 나온것 입니다.
그리고 많이 사용되는 containts() 메소드가 있는데 이것은 인자로 받은 Object형 데이터가 Vector 저장 객체 안에 저장되어 있는지 확인하고 그 결과를 boolean형으로 반환하는 메소드입니다.
이런 메소드는 데이터의 유,무를 확인할때 많이 사용되죠. 그 다음으로 메소드중에 clone()이라는 메소드에 대해서 설명드리겠습니다. 이것은 java.lang.Object 안에 있는 메소드였는데 여기서 다시 재정의 한거죠. (결국 다른 클래스에서도 clone()을 쓸수 있다는 말입니다. 왜인지는 아시겠죠.^^)
clone()메소드는 단어뜻 그대로 복제를 만들어 내는 메소드입니다. 원본 객체를 복사한 동일한 객체를 만드는 거죠. 음... 왜 이런걸 만들어 쓸까요? 헤헤^^ 보통 이 메소드는 원본 객체의 보호를 위해 많이 쓰입니다. 보호라니까 말이 조금 이상한데 객체를 변경하거나 다른 용도로 사용하는데 원본 객체 즉, 원래 상태를 유지하고 있는 것이 필요할 경우에 변경사항이 있을 경우 clone() 메소드를 이용 복제품을 하나 만들어서 사용합니다.
그리고 마지막으로 제가 설명드릴 메소드는 elements()라는 메소드입니다. 이것 또한 조금 특이한 메소드인데 Enumeration 객체의 인스턴스를 반환합니다. 그러기 때문에 Enumeration과 Vector 저장 객체를 연결(?)할때 많이 사용됩니다.
뭐... 연결이라고 둘을 붙인다는것이 아니라 Vector 저장 객체로 Enumeration의 메소드를 사용하기 위하여 많이 사용됩니다.예제 소스를 보시면 어떤식으로 해야 되는지 단번에 알수 있을 겁니다.
그리고 데이터가 필요할 경우는 Enumeration의 hasMoreElements() 와 nextElement()등의 메소드를 이용하여 Vector에 저장되어 있는 데이터를 꺼내어 사용합니다. 여기까지가 Vector 클래스에서 가장 많이 쓰이는 메소드들에 대한 간략한 설명이었습니다. 제가 설명드린것 말고도 Vector 클래스는 많은 메소드를 가지고 있는데 그것들은 님이 API에서 찾아 보시고 여지껏 설명드린것과 같은 방법으로 직접 알아보시기 바라겠습니다. 에궁 또 힘들게 한강좌를 끝냈네요... 강좌를 한 강좌, 한 강좌,진행할때마다 조금씩 더 어려워지고 막중한 책임감이 느껴집니다. 그래도 열심히 해야겠죠. ^^ 비록 미숙한 실력이지만 많은 시작하는 분들이 제 강좌를 보고 아주 조금만이라도 자바에 가까워지면 저는 그것으로 만족입니다. 그리고 그것을 위해 다음강좌도 열심히 해야겠죠.^^ 그럼 다음 강좌로....얍!!!!


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