Java에서 ArrayList와 Vector는 모두 List 인터페이스를 구현한 대표적인 컬렉션 클래스입니다. 두 클래스 모두 요소의 삽입 순서를 유지하며 내부적으로 배열을 기반으로 동작한다는 공통점이 있습니다. 하지만 스레드 안정성, 성능, 크기 확장 방식 등 여러 면에서 중요한 차이점을 가지고 있어, 상황에 맞는 선택이 필요합니다.
다음 표는 ArrayList와 Vector의 핵심적인 차이점을 정리한 것입니다.
| 번호 | 구분 | ArrayList | Vector |
|---|---|---|---|
| 1 | 동기화 | 동기화되지 않습니다(non-synchronized). | 동기화됩니다(synchronized). |
| 2 | 크기 증가 | 용량을 초과하는 요소가 추가되면 현재 크기의 50%만큼 증가합니다. | 용량을 초과하는 요소가 추가되면 현재 크기의 100%만큼 증가합니다. |
| 3 | 레거시 | 레거시 클래스가 아니며, Java Collections Framework 이후 도입된 클래스입니다. | JDK 1.0부터 존재했던 레거시(구버전) 클래스입니다. |
| 4 | 속도 | 동기화 오버헤드가 없어 상대적으로 빠릅니다. | 동기화 처리로 인해 상대적으로 느립니다. |
| 5 | 순회 방식 | Iterator 인터페이스를 사용하여 요소를 순회합니다. | Iterator와 Enumeration 인터페이스를 모두 사용할 수 있습니다. |
ArrayList vs Vector 예제 코드
두 클래스는 사용법이 거의 동일하기 때문에 코드 작성 방식에 큰 차이가 없습니다. 아래 예제를 통해 실제 동작을 확인해 보겠습니다.
JavaTester.java
import java.util.ArrayList;
import java.util.Vector;
import java.util.List;
public class JavaTester {
public static void main(String args[]) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
List<String> list1 = new Vector<>();
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("D");
System.out.println(list);
System.out.println(list1);
}
}실행 결과
[A, B, C, D] [A, B, C, D]
어떤 것을 선택해야 할까?
일반적인 단일 스레드 환경에서는 동기화 오버헤드가 없는 ArrayList를 사용하는 것이 권장됩니다. 반면, 여러 스레드가 동시에 하나의 리스트에 접근하고 수정해야 하는 멀티스레드 환경이라면 스레드 안전성을 보장하는 Vector를 고려할 수 있습니다. 다만 최신 Java 개발에서는 Vector보다 Collections.synchronizedList()나 CopyOnWriteArrayList 같은 대안을 사용하는 것이 더 좋은 방법으로 알려져 있습니다.