본문 바로가기

자바/자바 개념

[Java] Vector<E> / 2021.12.29

* 참고 자료 : 명품 자바 프로그래밍

 

Vector<E>는 배열을 가변 크기로 다룰 수 있게 하고, 객체의 삽입, 삭제, 이동이 쉽도록 구성한 컬렉션 클래스이다. 벡터는 삽입되는 요소의 개수에 따라 자동으로 크기를 조절하고, 요소의 삽입과 삭제에 따라 자동으로 요소들의 자리를 이동한다.

 

- 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 리턴
boolean isEmpty() 벡터가 비어있으면 true 리턴
E elementAt(int index) 인덱스 index의 요소 리턴
E get(int index) 인덱스 index의 요소 리턴
int indexOf(Object o) o와 같은 첫 번째 요소의 인덱스 리턴, 없으면 -1 리턴
E remove(int index) 인덱스 index의 요소 삭제
boolean remove(Object o) 겍체 o와 같은 첫 번째 요소를 벡터에서 삭제
void removeAllElements() 벡터의 모든 요소를 삭제하고 크기를 0으로 만듦
int size() 벡터가 포함하는 요소의 개수 리턴
Object[] toArray() 벡터의 모든 요소를 포함하는 배열 리턴

 

1. 벡터 생성

벡터를 생성할 때, Vector<E>의 요소 E에 요소로 사용할 타입을 지정해야 한다. 예를 들어, 정수 값만 삽입 가능한 벡터를 만들고자 하면 다음과 같이 E에 Integer를 지정하여 벡터를 생성한다. int, char, double 등의 기본 타입은 E에 사용할 수 없다. 만일 Vector에서 E에 구체적인 타입을 지정하지 않고 Vector로만 사용하면, 컴파일러가 경고 메시지를 출력한다. 

 

Vector<Integer> v = new Vector<Integer>();

 

레퍼런스 변수 선언과 벡터 생성을 분리하여 코드를 만들 수 있으며, 문자열만 다루는 벡터는 다음과 같이 생성할 수 있다. 

 

Vector<String> StringVector; // 제네릭 컬렉션에 대한 레퍼런스 변수 선언
StringVector = new Vector<String>(); // 문자열 벡터 생성

 

개발자는 생성된 벡터의 용량을 굳이 알 필요가 없다. 컬렉션은 자신의 용량을 스스로 조절하기 때문이다. 만일, 용량을 초기에 설정하고자 한다면 다음과 같이 생성자에 용량을 지정하면 된다.

 

Vector<Integer> v = new Vector<Integer>(5); // 초기 용량이 5인 벡터 생성

 

2. 벡터에 요소 삽입 (add)

add() 메소드를 이용하면 벡터의 끝이나 중간에 요소를 삽입할 수 있다. 

다음은 정수 5, 4, -1을 순서대로 벡터의 맨 뒤에 삽입하는 예제이다. 정수를 Integer 객체로 만들어 삽입한다.

벡터 v에는 Integer외의 다른 타입의 객체는 삽입할 수 없다.

 

// 벡터 v는 Integer 객체
v.add(Integer.valueOf(5)); 
v.add(Integer.valueOf(4)); 
v.add(Integer.valueOf(-1)); 

자동 박싱 기능을 활용한다면 ?
v.add(5);
v.add(4);
v.add(-1);

 

또한 벡터에는 null도 삽입할 수 있기 때문에, 벡터를 검색할 때 null이 존재할 수 있음을 염두에 두어야 한다.

 

v.add(null);

 

add()를 이용하여 벡터의 중간에 객체를 삽입할 수 있다.

아래 코드는 인덱스 2의 위치에 정수 100을 삽입하고 기존의 인덱스 2와 그 뒤에 있는 요소들을 모두 한 자리씩 뒤로 이동시킨다. 하지만 벡터에 1개의 요소(인덱스 0의 위치)만 들어있는 상채라면 이 코드가 실행될 때 예외가 발생한다. 인덱스 1이 빈 공간이 되기 때문이다.

 

v.add(2, 100); // 인덱스 2의 위치에 정수 100을 삽입

 

3. 벡터 내의 요소 알아내기 (get, elementAt)

벡터 내에 존재하는 요소를 알아내기 위해서는 get()이나 elementAt()  메소드를 이용한다. 

다음과 같이 벡터에 3개의 정수가 들어 있다고 하자.

 

Vector<Integer> v = new Vector<Integer>();
v.add(Integer.valueOf(5)); 
v.add(Integer.valueOf(4)); 
v.add(Integer.valueOf(-1)); 

 

get() 이나 elementAt() 메소드는 인자로 주어진 인덱스에 있는 Integer 객체를 리턴한다. 다음은 벡터 v의 인덱스 1 위치에 있는 정수 값을 읽는 코드이다.

 

Integer obj = v.get(1); // 벡터의 1번째 Integer 객체를 얻어낸다.
int i = obj.intValue(); // obj에 있는 정수를 알아냄. 이값은 4

--> 한 문장으로 쓰면?
int i = v.get(1); // 자동 언박싱

 

4. 벡터의 크기와 용량 알아내기 (size, capacity)

벡터의 크기란 벡터에 들어 있는 요소의 개수를 말하며, 벡터의 용량이란 수용할 수 있는 크기를 말한다. 벡터의 크기는 다음과 같이 size() 메소드를 호출하고, 벡터의 용량은 다음 capacity() 메소드를 호출한다.

 

int len = v.size(); // 벡터의 크기, 벡터에 존재하는 요소 객체의 수
int cap = v.capacity(); // 벡터의 용량

 

5. 벡터에서 요소 삭제 (remove, removeAllElements)

벡터 내에 임의의 인덱스에 있는 요소를 삭제할 수 있다. 다음과 같이 remove() 메소드를 이용한다.

벡터의 모든 요소를 삭제하려면, 다음과 같이 removeAllElements() 를 호출한다.

v.remove(1); // 인덱스 1의 위치에 있는 요소 삭제
v.removeAllElements();

 

- 정수만 다루는 Vector<Integer> 컬렉션 활용

정수만 다루는 벡터를 생성하고, 활용하는 기본 사례를 보인다.

 

package Chapter7;
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); // 5, 4, -1 차례로 삽입
		
		// 벡터 중간에 삽입하기
		v.add(2, 100); // 5, 4, 100, -1
		
		System.out.println("벡터 내의 요소 객체 수 : " + v.size()); // 크기 4
		System.out.println("벡터의 현재 용량 : " + v.capacity()); // 벡터 용량 10
		
		// 모든 요소 정수 출력하기
		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); // 벡터의 i 번째 정수
			sum += n;
		}
		System.out.println("벡터에 있는 정수 합 : " + sum);
	}
}

 

출력 결과 : 

 

 

- Point 클래스만 다루는 Vector<Point> 컬렉션 활용

점 (x, y)를 표현하는 Point 클래스를 만들고, Point의 객체만 다루는 벡터를 작성하라.

 

package Chapter7;
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>(); // Point 객체를 요소로 다루는 벡터 생성
		
		// 3개의 Point 객체 삽입
		v.add(new Point(2, 3));
		v.add(new Point(-5, 20));
		v.add(new Point(30, -8));
		
		v.remove(1); // 인덱스 1의 Point(-5, 20) 객체 삭제
		
		// 벡터에 있는 Point 객체 모두 검색하여 출력
		for(int i=0; i<v.size(); i++) {
			Point p = v.get(i);  // 벡터의 i 번째 Point 객체 얻어내기
			System.out.println(p); // p.toString()을 이용하여 객체 p 출력
		}
	}
}

 

출력 결과 :

 

 

* Vector 와 ArrayList 차이 ? 

Vector와 ArrayList는 거의 동일하다. 

크게 다른 점은 ArrayList는 스레드 간에 동기화를 지원하지 않기 때문에, 다수의 스레드가 동시에 ArrayList에 요소를 삽입하거나 삭제할 때 ArrayList의 데이터가 훼손될 우려가 있다. 하지만 멀티스레드 동기화를 위한 시간 소모가 없기 때문에, ArrayList는 Vector 보다 속도가 빨라, 단일 스레드 응용에는 더 효과적이다.