Vector<E>
Vector<E>는 배열을 가변 크기로 다룰 수 있게 하고, 객체의 삽입, 삭제, 이동이 쉽도록 구성한 컬렉션 클래스입니다. 벡터는 는 삽입되는 요소의 개수에 따라 자동으로 크기를 조절하고, 요소의 삽입과 삭제에 따라 자동으로 요소들의 자리를 이동합니다.
백터 생성
객체를 생성할 때, Vector<E>의 E에 요소로 사용할 타입을 지정합니다. 예를 들어, 정수 값만을 다루는 벡터를 만들고자 하면 다음과 같이 E에 Integer를 지정합니다.
Vector<Integer> v = new Vector<Integer>();
벡터 v는 int, char, double 등의 기본 타입은 E에 사용할 수는 없습니다.
Vector<int> v = new Vector<int>(); // 오류. int는 사용 불가
레퍼런스 변수 선언과 벡터 생성을 분리하여 코드를 만들 수 있으며, 문자열만 다루는 벡터는 다음과 같이 생성할 수 있습니다.
Vector<String> stringVector; // 제네릭 컬렉션에 대한 레퍼런스 변수 선언
StringVector = new Vector<String>(); // 문자열 백터 생성
만일 Vector<E>에서 E에 구체적인 타입을 지정하지 않고 Vector로만 사용하면, 컴파일러가 경고 메시지를 출력합니다.
Vector<Integer> v = new Vector<Integer>(5000); // 초기 용량이 5000인 벡터 생성

Vector<E> 클래스의 주요 메소드
| 메소드 | 설명 |
| boolean add (E element) | 벡터는 맨 뒤에 element 추가 |
| void add(int index, E element) | 인덱스는 index에 element를 삽입 |
| int capacity() | 벡터의 현재 용량 리턴 |
| boolean addAll(Collection<? extends E> c) | 컬렉션 c의 모든 요소를 벡터의 맨 뒤에 추가 |
| void clear() | 벡터의 모든 요소 삭제 |
| boolean contains(Object o) | 벡터가 지정된 객체 o를 포함하고 있으면 true 리턴 |
| E elementAt(int index) | 인덱스 index의 요소 리턴 |
| E get(int index) | 인덱스 index의 요소 리턴 |
| int indexOf(Object 0) | o와 같은 첫 번째 요소의 인덱스 리턴, 없으면 -1 리턴 |
| boolean isEmpty() | 벡터가 비어 있으면 true 리턴 |
| E remove(int index) | 인덱스 index의 요소 삭제 |
| boolean remove(Object o) | 객체 o와 같은 첫번째 요소를 벡터에 삭제 |
| void removeAllElements() | 벡터의 모든 요소를 삭제하고 크기를 0으로 만듬 |
| int size() | 벡터가 포함하는 요소의 개수 리턴 |
| Object[] toArray() | 벡터의 모든 요소를 포함하는 배열 리턴 |
벡터에 요소 삽입
add() 메소드를 이용하면 백터의 끝이나 중간에 요소를 삽입할 수 있습니다.
v.add(Integer.valueOf(5));
v.add(Integer.valueOf(4));
v.add(Integer.valueOf(-1));
자동 박싱 기능을 활용하면 앞의 코드는 다음과 같이 해도 됩니다.
v.add(5); // 5 -> new Integer(5)로 자동 박싱됨
v.add(4);
v.add(-1);
자동 박싱에 의해 int 타입의 정수는 자동으로 Integer 객체로 변환되어 삽입됩니다.
그러나 벡터 v에는 Integer 외의 다른 타입의 객체로 삽입할 수 없습니다.
v.add("hello"); // 컴파일 오류
v.add(3.5); // 컴파일 오류
v.add(new Person()); // 컴파일 오류
벡터에는 null도 삽입할 수 있기 때문에, 벡터를 검색할 때 null이 존재할 수 있음을 염두에 두어야 합니다.
v.add(null);
add()를 이용하여 벡터의 중간에 객체를 삽입할 수 있습니다.
v.add(2, 100);
이 코드는 인덱스 2의 위치에 정수 100을 삽입하고 기존의 인덱스 2와 그 뒤에 있는 요소들을 모두 한 자리씩 뒤로 이동시킵니다. 하지만, 벡터에 1개의 요소(인덱스 0의 위치)만 들어 있는 상태라면 이 코드가 실행될 때 예외가 발생합니다. 인덱스 1이 빈 공간이 되기 때문입니다.
벡터 내의 요소 알아내기
벡터 내에 존재하는 요소를 알아내기 위해 get()이나 elementAt() 메소드를 이용합니다.
Vector<Integer> v = new Vector<Integer>();
v.add(5);
v.add(4);
v.add(-1);
get()이나 elementAt() 메소드는 인자로 주어진 인자로 인덱스에 있는 Integer 객체를 리턴합니다.
Integer obj = v.get(1); // 벡터의 1번째 Integer 객체를 얻어낸다.
int i = obj.intValue(); // obj에 있는 정수를 알아냄. 이 값은 4
앞의 두 문장은 다음 한 문장으로 써도 됩니다.
int i = v.get(1); // 자동 언박싱
자동 언박싱에 의해 v.get(1)이 리턴하는 Integer 객체의 정수 값(4)이 변수 i에 저장됩니다.
벡터의 크기와 용량 알아내기
벡터의 크기란 벡터에 들어 있는 요소의 개수를 말하며, 벡터의 용량이란 수용할 수 있는 크기를 말합니다. 벡터의 크기는 다음과 같이 size() 메소드를 호출합니다.
int len = v.size(); // 벡터의 크기, 벡터에 존재하는 요소 객체의 수
벡터의 용량은 다음 capacity() 메소드를 호출합니다.
int cap = v.capacity(); // 벡터의 용량
벡터에서 요소 삭제
벡터 내의 임의의 인덱스에 있는 요소를 삭제할 수 있다. 다음과 같이 remove() 메소드를 이용합니다.
v.remove(1); // 인덱스 1의 위치에 있는 요소 삭제
이 코드는 인덱스 1의 위치에 있는 요소를 삭제합니다. 코드의 실행 결과 뒤에 있는 요소들이 한 자리씩 앞으로 이동합니다. 다음과 같이 객체 레퍼런스를 이용하여 remove()를 호출할 수도 있습니다.
Integer = Integer.valueOf(100); // m은 객체 레퍼런스
v.add(m);
...
v.remove(m); // 레퍼런스 m의 요소 삭제
벡터의 모든 요소를 삭제하려면, 다음과 같이 removeAllElements()를 호출합니다.
v.removeAllElements();


컬렉션과 자동 박싱 / 언박싱
컬렉션은 객체들만 요소(element)로 다룬다고 설명하였다. 그러므로 기본 타입의 값은 wrapper 클래스로 객체화하여 삽입합니다.
Vector<Integer> v = new Vector<Integer>();
v.add(Integer.valueOf(4)):
v.add(Integer.valueOf(-1));
그러나 자동 박싱(auto boxing)에 의해 int 타입을 값을 사용하면 자동으로 Integer 객체로 변환되어 삽입됩니다.
v.add(4); // 정수 4가 Integer(4)로 자동 박싱됨
v.add(-1); // 정수 -1이 Integer(-1)로 자동 박싱됨
컬렉션으로부터 값을 얻아내는 과정에서 자동 언박싱(auto unboxing)이 일어납니다.
int k = v.get(0); // k = 4
자동 박싱/언박싱은 모든 컬렉션 클래스에서 작동합니다.
정수만 다루는 Vector<Integer> 컬렉션 활용
import java.util.Vector;
public class VectorEx {
public static void main(String[] args) {
Vector<Integer> v = new Vector<Integer>();
v.add(5);
v.add(4);
v.add(-1);
v.add(2, 100);
System.out.println("벡터 내의 요소 객체 수 : " + v.size());
System.out.println("벡터의 현재 용량 : " + v.capacity());
for (int i = 0; i < v.size(); i++) {
int n = v.get(i);
System.out.println(n);
}
int sum = 0;
for (int i = 0; i < v.size(); i++) {
int n = v.elementAt(i);
sum += n;
}
System.out.println("벡터에 있는 정수 합 : " + sum);
}
}
실행 결과
벡터 내의 요소 객체 수 : 4
벡터의 현재 용량 : 10
5
4
100
-1
벡터에 있는 정수 합 : 108
Point 클래스만 다루는 Vector<Point> 컬렉션 활용
import java.util.Vector;
class Point {
private int x, y;
public Point(int x, int y) {
this.x = x; this.y = y;
}
public String toString() {
return "(" + x + "," + y + ")";
}
}
public class PointVectorEx {
public static void main(String[] args) {
Vector<Point> v = new Vector<Point>();
v.add(new Point(2, 3));
v.add(new Point(-5, 20));
v.add(new Point(30, -8));
v.remove(1);
for(int i = 0; i < v.size(); i++) {
Point p = v.get(i);
System.out.println(p);
}
}
}
실행 결과
(2,3)
(30,-8)
컬렉션 매개변수로 받는 메소드 만들기
public void printVector<Vector<Integer> v) {
for (int i = 0; i < s.size(); i++) {
int n = v.get(i); // 벡터의 i번째 정수
System.out.println(n);
}
}
이 메소드를 호출하는 코드는 다음과 같이 작성합니다.
Vector<Integer> v = new Vector<Integer>(); // Integer 벡터 생성
printVector(v); // 메소드 호출
자바의 타입 추론 기능의 진화, Java 7, Java 10
다음은 제네릭 컬렉션을 사용하여 객체를 생성하는 전형적인 문법입니다.
Vector<Integer> v = new Vector<Integer>(); // Java 7 이전
Java 7부터 제네릭의 객체 생성부의 <> 내(다이어몬드 연산자)에 타입 매개변수를 생략하면 컴파일러가 추론하여 타입 매개변수를 찾아주도록 하였습니다.
Vector<Integer> v = new Vector<>(); // Java 7부터
Java10은 아예 var 키워드를 도입하여 컴파일러에게 변수 타입을 추론하도록 하는 기능을 더하였는데, var를 이용하면 앞의 코드를 다음과 같이 작성할 수 있습니다.
var v = new Vector<Integet>(); // Java 10부터
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
| 컬렉션의 순차 검색을 위한 Iterator (0) | 2025.04.02 |
|---|---|
| ArrrayList<E> (0) | 2025.03.30 |
| 컬렉션과 제네릭 (0) | 2025.03.24 |
| Calendar 클래스 (0) | 2025.03.21 |
| Math 클래스 (0) | 2025.03.18 |