Java Vector : 멀티스레드 환경에서 안전한 리스트 구현체
Java에서 Vector는 List 인터페이스를 구현한 동기화된(synchronized) 자료구조입니다. Vector는 동시성 제어가 필요한 멀티스레드 환경에서 안전하게 사용할 수 있는 리스트 구현체로, ArrayList와 유사한 구조를 가지고 있습니다.
Vector란?
Vector는 Java의 초기부터 존재했던 클래스로, List 인터페이스를 구현하며, 동기화(synchronization)가 보장되는 특징을 가집니다. Vector는 ArrayList와 유사하게 동적 배열을 기반으로 하지만, 내부의 모든 메서드가 동기화되어 멀티스레드 환경에서 안전하게 동작합니다.
Vector의 주요 특징
- 동기화된 메서드 : Vector의 모든 메서드는 동기화되어 있어 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
- 동적 배열 : Vector는 크기를 자동으로 조정하는 동적 배열을 사용하며, 데이터가 추가됨에 따라 자동으로 크기가 늘어납니다.
- 초기 크기 지정 가능 : Vector는 초기 크기를 지정할 수 있으며, 용량이 가득 차면 두 배로 증가합니다.
- 중복 요소 허용 : Vector는 중복된 요소를 허용하며, 순서대로 요소를 저장합니다.
Vector의 구조 및 동작 원리
Vector는 내부적으로 배열을 사용해서 요소를 관리합니다. 배열이 가득 차면 새로운 배열을 생성하고 기존 데이터를 복사하여 크기를 확장합니다. 기본적으로 크기가 두 배가 증가하지만, 생성 시 용량 증가 인자를 지정할 수 있습니다.
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
// Vector 생성
Vector<String> colors = new Vector<>(3);
// 요소 추가
colors.add("Red");
colors.add("Blue");
colors.add("Green");
// 특정 요소 접근
System.out.println("첫 번째 색상 : " + colors.get(0)); // 첫 번째 색상 : Red
// 요소 삽입
colors.add(1, "Yellow");
// 요소 제거
colors.remove("Blue");
// 전체 요소 출력
for (String color : colors) {
System.out.println(color);
}
}
}
Vector의 장단점
- 장점
- 동기화 지원 : Vector는 동기화를 기본으로 지원하기 때문에 멀티스레드 환경에서 데이터를 안전하게 관리할 수 있습니다.
- 동적 크기 조정 : Vector는 크기를 자동으로 조정할 수 있어, 배열의 크기를 사전에 명확히 알 수 없는 경우에 유용합니다.
- 초기 크기 및 증가 인자 설정 가능 : Vector는 생성 시 초기 크기와 용량 증가 인자를 설정할 수 있어 메모리 사용을 최적화할 수 있습니다.
- 단점
- 성능 저하 : 동기화로 인해 ArrayList에 비해 성능이 다소 저하될 수 있습니다. 멀티스레드 환경이 아니면 불필요한 성능 손실이 발생할 수 있습니다.
- 구식 클래스 : Vector는 Java 초기부터 존재했으며, 이후 ArrayList와 Collections.synchronizedList 등의 대안이 나타나면서 사용 빈도가 줄어들었습니다.
- 비효율적인 메모리 사용 : 크기가 두 배로 증가하기 때문에 메모리 효율이 떨어질 수 있습니다.
Vecotr와 ArrayList의 비교
Vector와 ArrayList는 모두 List 인터페이스를 구현하지만, 주요 차이점은 동기화의 유무입니다.
- Vector : 동기화된 메서드로 멀티스레드 환경에서 안전하게 동작하지만, 성능이 떨어질 수 있습니다.
- ArrayList : 동기화되지 않은 메서드로 성능이 우수하지만, 멀티스레드 환경에서는 추가적인 동기화가 필요합니다.
Vector와 Collections.synchronizedList
Vector의 동기화 기능이 필요하지만, 다른 리스트 구현체를 사용할 경우 Collecions.synchronizedList를 사용할 수 있습니다. 이는 동기화된 리스트를 생성하는 데, ArrayList와 같이 성능이 더 우수한 리스트를 기반으로 사용할 수 있는 장점이 있습니다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SynchronizedListExample {
public static void main(String[] args) {
List<String> list = Collections.synchronizedList(new ArrayList<>());
// 요소 추가
list.add("One");
list.add("Two");
// 동기화 블록에서 요소 접근
synchronized (list) {
for (String item : list) {
System.out.println(item);
}
}
}
}
결론
Java Vector는 멀티스레드 환경에서 안전하게 사용할 수 있는 동기화된 리스트 구현체입니다. Vector는 과거에 사용했지만, 성능상의 이슈로 현재 Java 애플리케이션에서는 ArrayList나 다른 대안이 더 자주 사용됩니다. 그러나, 멀티스레드 환경에서 동기화가 필요한 경우 여전히 유용한 클래스로 남아있긴 합니다. 상황에 따라 Vector와 ArrayList, Collections.synchronizedList 중 적절한 자료구조를 선택하는 것이 중요합니다.
'🚀 컴퓨터 지식 > 자료구조' 카테고리의 다른 글
[자료구조] 자바 Stack 후입선출(LIFO) 클래스 가이드 (0) | 2024.08.21 |
---|---|
[Data Structure] 자료구조 LinkedList 효율적인 데이터 삽입과 삭제를 위한 연결 리스트 (0) | 2024.05.27 |
[자료구조] Java ArrayList 동적 배열의 활용 (0) | 2024.05.24 |
[자료구조] 자바 List 인터페이스(Interface) 기본 개념 및 활용 (0) | 2024.05.22 |
[자료구조] Java Collections Framework 필수 개념과 활용법 (0) | 2024.05.22 |