[Java] 자바 Vector(벡터) 사용법 & 예제, vector vs arrayList

자바 Vector에 대해서 궁금하신가요?? 자바 Vector는 List인터페이스의 구현체입니다. 그럼 아래에서 Vector란 무엇이고 Vector의 장점, 사용법, ArrayList와 비교했을 때 Vector의 단점을 알아보겠습니다.


목차


자바 Vector란??

자바 Vector는 Java Collections Framework의 일부이며 자동으로 크기 조정이 가능한 컬렉션 클래스입니다. Vector는 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 메소드들을 실행 할 수 없습니다. 하나의 스레드가 실행을 완료해야 다른 스레드들이 실행 할 수 있습니다. 하지만 동기화라는 특징 때문에 스레드가 아닌 환경에서는 거의 사용되지 않습니다.


List 인터페이스에 대해서 궁금하시다면 여기를 클릭해 주세요.


Vector의 장점

  • 동적 크기 조정
    생성 후 크기가 고정된 일반 배열과 달리 Vector는 필요에 따라 확장 및 축소할 수 있으므로 다양한 크기의 컬렉션을 처리할 때 보다 유연하게 사용할 수 있습니다.
  • 스레드 안전성
    Vector의 메서드는 동기화되어 여러 스레드가 데이터 손상이나 불일치 없이 벡터를 안전하게 조작할 수 있습니다.
  • 레거시 코드 호환성
    벡터는 Java 1.0에서 도입되어 레거시 컬렉션 프레임워크의 일부입니다. 새로운 코드를 작성할 때에는 ArrayList 또는 LinkedList와 같은 최신 컬렉션을 사용하는 것이 좋습니다. 벡터는 여전히 이전 자바 코드 베이스와의 호환성을 유지하는 데 사용됩니다.

Vector의 단점, ArrayList와 비교

  • 동기화 오버헤드
    동기화는 스레드 안전성을 보장하지만 성능 오버헤드를 발생시켜 단일 스레드 작업 속도에 영향을 미칩니다.
  • 단일 스레드 시나리오의 성능
    기본적으로 비동기화되는 ArrayList와 달리 Vector의 메서드는 스레드 안전을 위해 lock을 획득하고 해제해야 합니다.
  • 레거시 상태 및 제한된 채택
    자바의 초기 컬렉션 클래스 중 하나인 Vector는 최신 컬렉션 클래스(ArrayList)에 비해 최적화 및 개선 사항이 부족합니다. 결과적으로 Vector는 ArrayList보다 선호도가 떨어집니다.
  • 단일 스레드 환경에서 스레드 안전 오버헤드
    스레드 안전성은 단일 스레드 환경에서 Vector를 사용하는 경우 단점이 됩니다. Vector의 동기화 오버헤드는 불필요할 수 있으며 애플리케이션의 전체 성능에 영향을 미칩니다. 이러한 경우 ArrayList의 비동기 특성이 더 적절하고 효율적입니다.

추가로 ArrayList에 대해서 더 궁금하시다면 여기를 클릭해주세요.


Vector 사용법


Vector 선언

Vector V = new Vector(); // Object 타입으로 선언

Vector<Integer> v1 = new Vector<Integer>(); // int 타입으로 선언 
Vector<Integer> v2 = new Vector<>(); // 타입 선언 생략 가능
Vector<Integer> v3 = new Vector<Integer>(5); // 초기 용량 세팅 
Vector<Integer> v4 = new Vector<Integer>(Arrays.asList(1, 2, 3, 4)); // 선언하고 초기값 세팅


위의 예제와 같이 Class, Integer, String, Character 등의 다양한 타입으로 선언이 가능합니다. 제네릭스를 생략해도 되지만 캐스팅 에러가 발생할 수 있으니 타입을 명시하는 것을 추천합니다.


Vector 데이터 추가

데이터 추가 과정
  • add(Object) : Vector의 마지막에 value 추가
  • add(int index, Object) : index위치에 value 추가
Vector<Integer> v = new Vector<Integer>();

v.add(5); //값 추가
v.add(-1); 
v.add(1,4); //index가 1인 위치에 -1 삽입
v.add(null); // null값도 add가능

// 결과 : [5, 4, -1, null]

데이터를 추가할 때 add(int index, Object), add(Object) 메소드를 사용합니다. index를 생략하면 Vector의 마지막에 데이터가 추가되며 index 중간에 값을 추가하면 해당 인덱스부터 마지막 인덱스까지 모두 한 칸씩 뒤로 밀려납니다.


Vector 데이터 변경

  • set(int index, Object) : index 위치에 데이터를 Object로 변경
Vector<Integer> v = new Vector<Integer>();

v.add(5); //값 추가
v.add(-1); 
v.add(1,4); //index가 1인 위치에 -1 삽입
v.add(null); // null값도 add가능

System.out.println(v);
    	
v.set(3, 2);  // index가 3인 곳에 데이터를 2로 변경( null -> 2)
    	
System.out.println(v);

set 메소드로 데이터를 변경할 수 있습니다. 데이터를 변경하려면 index를 알아야 변경이 가능합니다.


Vector 데이터 삭제

데이터 삭제 과정
  • remove(int Index) : index 위치에 있는 데이터 제거
  • removeAllElements() : 모든 데이터 제거
  • clear() : 모든 데이터 제거
Vector<Integer> v = new Vector<Integer>();

v.add(5); //데이터 추가
v.add(-1); 
v.add(1,4); //index가 1인 위치에 -1 삽입
v.add(null); // null값도 add가능
System.out.println(v);
    	
v.remove(2); //index가 2인 데이터 삭제
System.out.println(v); //출력해서 확인

v.removeAllElements(); // 데이터 전체 삭제
System.out.println(v);

v.add(5); //데이터 추가
v.add(-1); 
v.add(1,4);
v.add(null); 
System.out.println(v);
    	
v.clear(); // 데이터 전체 삭제
System.out.println(v); 

<결과>

데이터 삭제 결과

remove(2) 메소드를 호출하면 2번 인덱스에 데이터를 삭제합니다. 데이터를 삭제하고 그 뒤에 있는 데이터들을 한칸씩 앞으로 이동하게 됩니다. Vector 크기가 커질 수록 시간이 오래 걸립니다.


Vector 크기 구하기

  • size() : Vector의 데이터 갯수
  • capacity() : Vector의 물리적 크기(용량)
Vector<Integer> v = new Vector<Integer>(20); //초기용량 20

v.add(5); //데이터 추가
System.out.println("Size : " + v.size()); Vector의 데이터 갯수 : 1
System.out.println("Capacity : " + v.capacity()); Vector의 물리적 크기 : 20

// 결과 
Size : 1
Capacity : 20

Vector의 데이터가 들어있는 개수를 구하려면 size() 메소드를 사용하면 되고 물리적 크기(용량)를 알고 싶다면 capacity() 메소드를 사용하면 됩니다.


Vector 데이터 확인

  • get(int Index) : index위치의 데이터를 확인
Vector<Integer> v = new Vector<Integer>(); 
v.add(5);

System.out.println(v.get(0)); //0번 index에 해당하는 데이터를 확인

// 결과 : 5

Vector 출력하기

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

v.add(5); 
v.add(-1); 
v.add(1,4); 
v.add(null);

System.out.println(v); // 기본 출력

// get(i)를 사용하여 값 출력
for(int i = 0; i < v.size(); i++)
      System.out.print(v.get(i) + " ");

System.out.println();
		
// 향상된for문을 사용하여 값 출력
for(Integer i : v)
	System.out.print(i + " ");

System.out.println();
		
// Iterator 사용 값 출력
Iterator iter = v.iterator();
while(iter.hasNext())
	  System.out.print(iter.next() + " ");

System.out.println();


// forEach()메소드를 통해 출력( 자바 8부터 사용할 수 있다)
v.forEach(i -> System.out.print(i + " "));

<결과>

데이터 출력 결과

자바 Vector에서 값을 출력하는 방법은 get(), 향상된for문, Iterator 클래스를 사용하여 hasNext() 메서드를 사용하는 방법, forEach()메소드를 사용하는 방법이 있습니다.


자바 Vector에 대해서 좀 더 자세히 알고 싶으시다면 여기를 클릭해 주세요.


이번 포스팅은 자바 Vector에 대해서 알아봤습니다. 자바 Vector는 개체 컬렉션을 관리하기 위해 크기 조정 가능한 데이터 구조를 제공합니다. 기본 제공 동기화로 인해 스레드로부터 안전하므로 다중 스레드 시나리오에 적합합니다. 그러나 단일 스레드 환경에서 성능 오버헤드를 염두에 두는 것이 중요합니다.

결론적으로 자바 Vector는 특정 컨텍스트에서 유용한 도구로 남아 있지만 효율적인 솔루션을 찾기 위해 자바 컬렉션 프레임워크에서 사용할 수 있는 다양한 컬렉션 클래스를 탐색하는 것이 좋습니다.

자바 추가 정보

  • ArrayList에 대해서 궁금하시다면 여기를 클릭해 주세요.
  • List 인터페이스에 대해서 궁금하시다면 여기를 클릭해 주세요.
  • Set 인터페이스에 대해서 궁금하시다면 여기를 클릭해 주세요.

Leave a Comment