Vector<E>
Vector<E>의 특성
java.util.Vector
- <E>에서 E 대신 요소로 사용할 특정 타입을 지정하여 구체화
여러 객체들을 삽입, 삭제, 검색하는 컨테이너 클래스
- 배열을 가변 크기로 다룰 수 있게 함 → 배열의 길이 제한 극복
- 원소의 개수에 따라 자동으로 크기 조절
Vector에 삽입 가능한 것
- 객체
- null
- 기본 타입은 Wrapper 객체로 저장
Vector에 객체 삽입
- 벡터의 맨 뒤에 객체 추가
- 벡터 중간에 객체 삽입
Vector에서 객체 삭제
- 임의의 위치에 있는 객체 삭제 가능
- 객체 삭제 후 자동으로 자리 이동
벡터 생성
Vector<Integer> v = new Vector<Integer>();
- Vector<E>의 E에 요소로 사용할 타입을 지정(위 경우는 Integer 타입)
- int, double, char 등의 기본 타입은 E에 사용 불가
Vector<String> stringVector; //변수 선언
stringVector = new Vector<String>(); //문자열 벡터 생성
- 레퍼런스 변수 선언과 벡터 생성 분리 가능
- E에 타입을 지정하지 않고 Vector로만 사용하면 경고 메시지 출력
- 컬렉션은 자신의 용량을 스스로 조절하므로 개발자는 벡터의 용량을 굳이 알 필요 없음
Vector<Integer> v = new Vector<Integer>(5); //초기 용량이 5인 벡터 생성
- 용량을 설정하고자 한다면 생성자에 용량 지정
Vector<E> 클래스 주요 메소드
벡터에 요소 삽입
add() 메소드를 이용해 벡터의 끝에 요소 삽입
Vector<Integer> v = new Vector<Integer>();
//5, 4, -1을 순서대로 벡터의 맨 뒤에 삽입
v.add(Integer.valueOf(5));
v.add(Integer.valueOf(4));
v.add(Integer.valueOf(-1));
-정수를 Integer 객체로 만들어 삽입
v.add(5); //5 -> new Integer(5)로 자동 박싱
v.add(4);
v.add(-1);
- 자동 박싱 기능을 활용하면 위와 같이 표현해도 무방
v.add("hello"); //컴파일 오류
v.add(3.5); //컴파일 오류
v.add(new Person()); //컴파일 오류
v.add(null); //벡터에 null 삽입 가능
- v의 요소에 Integer 타입이 지정되었으므로 다른 타입의 요소 삽입 불가
add(int i, E element) 메소드를 사용해 벡터의 중간에 객체 삽입
v.add(2, 100);
//인덱스 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);
Integer obj = v.get(1); //벡터의 1번째 Integer 객체를 알아냄
int i = obj.intValue(); //obj에 있는 정수를 알아냄 >> 4
int i = v.get(1); //자동 언박싱
- get(), elementAt() 메소드는 인자로 주어진 인덱스에 있는 Integer 객체를 리턴
- 자동 언박싱되므로 한 문장으로 표시 가능(line 3)
- 자동 언박싱에 의해 v.get(1)이 리턴하는 Integer 객체의 정수 값(4)이 변수 i에 저장
벡터의 크기와 용량 알아내기
벡터의 크기
- 벡터에 들어 있는 요소의 개수
- size() 메소드 사용
int len = v.size();
벡터의 용량
- 벡터가 수용할 수 있는 크기
- capacity() 메소드
int cap = v.capacity();
벡터에서 요소 삭제
- remove() 메소드
- removeAllElements() 메소드
v.remove(1); //인덱스 1 위치의 요소 삭제
- 실행 결과 뒤에 있는 요소들이 한 자리씩 앞으로 이동
Integer m = Integer.valueOf(100); //객체 레퍼런스 m
v.add(m);
...
v.remove(m); //레퍼런스 m의 요소 삭제
- 객체 레퍼런스로 remove() 호출 가능
v.removeAllElements();
- 벡터의 모든 요소 삭제
컬렉션과 자동 박싱/언박싱
- 컬렉션의 요소로는 객체만 가능하므로 기본 타입의 값은 Wrapper 클래스로 객체화하여 삽입
- 컬렉션으로부터 값을 얻어낼 때는 자동 언박싱 발생
Vector<Integer> v = new Vector<Integer>();
v.add(Integer.valueOf(4));
v.add(Integer.valueof(-1));
- 정수를 Integer 객체로 만들어 저장
v.add(4); //정수 4가 Integer(4)로 자동 박싱
v.add(-1); //정수 -1이 Integer(-1)로 자동 박싱
- int 타입 값을 사용하면 자동 박싱에 의해 Integer 객체로 변환되어 삽입
//자동 언박싱
int k = v.get(0); //k=4
- 자동 언박싱을 활용하여 벡터로부터 정수 값을 바로 얻어냄
컬렉션을 매개변수로 받는 메소드 만들기
public void printVector(Vector<Integer> v){
for(int i=0; i<v.size; i++){
int n = v.get(i);
System.out.println(n);
}
}
- Integer 벡터를 매개변수로 받아 원소를 모두 출력하는 printVector() 메소드 작성
Vector<Integer> v = new Vector<Integer>();
printVector(v); //메소드 호출
- printVector() 메소드 호출
자바 타입 추론 기능의 진화
Java 7 이전
Vector<Integer> v = new Vector<Integer>();
Java 7 이후
- 컴파일러의 타입 추론 기능 추가
Vectoer<Integer> v = new Vector<>(); //<>안에 값 생략
- <> 연산자에 타입 매개변수를 생략하면 컴파일러가 추론하여 찾아 줌
Java 10 이후
- var 키워드 도입
- 컴파일러의 지역 변수 타입 추론 가능
var v = new Vector<Integer>();
예제 7-1 정수만 다루는 벡터를 생성하고 활용하는 기본 사례
import java.util.Vector;
public class VectorEx {
public static void main(String[] args) {
Vector<Integer> v=new Vector<Integer>(); //정수만 다루는 벡터 생성
v.add(5); //인덱스 0에 5
v.add(4); //인덱스 1에 4
v.add(-1); //인덱스 2에 -1
v.add(2, 100); //인덱스 2에 100이 삽입되고 -1은 인덱스 3으로 밀림
System.out.println("벡터 내 요소 수: "+v.size()); //벡터 크기
System.out.println("현재 벡터 용량: "+v.capacity()); //벡터 용량
for(int i=0; i<v.size(); i++) {
System.out.print(v.get(i)+" "); //벡터 내 i번째 정수 출력
}//모든 요소 출력
System.out.println();
int sum=0;
for(int i=0; i<v.size(); i++) {
sum+=v.elementAt(i);
}
System.out.println("벡터 내 모든 정수 합: "+sum);
}
}
예제 7-2 점 (x, y)를 표현하는 Point 클래스를 만들고 Point 객체만 다루는 Vector 작성