프로그래밍 언어/JAVA

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<Integer> v = new Vector<Integer>() 벡터 생성

 

 

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();

 

 

Vector<Integer> 생성 및 삽입 삭제 사례

 

컬렉션과 자동 박싱 / 언박싱

컬렉션은 객체들만 요소(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