
ArrayList와 거의 똑같이 생긴 클래스가 하나 더 있다. Vector다. 사용법도 비슷하고, 크기가 자동으로 늘어나는 것도 같다. 그런데 왜 굳이 둘로 나뉘어 있을까?
Vector는 ArrayList보다 먼저 나온 클래스다. Java 1.0 시절부터 있었고, ArrayList는 Java 1.2에서 등장했다. 기능 자체는 거의 동일하다. 크기가 동적으로 늘어나는 배열 기반의 리스트라는 점에서.
import java.util.Vector;
Vector<String> vector = new Vector<>();
vector.add("사과");
vector.add("바나나");
vector.add("딸기");
System.out.println(vector); // [사과, 바나나, 딸기]

둘의 핵심 차이는 동기화(Synchronization) 여부다.
| 구분 | Vector | ArrayList |
|---|---|---|
| 동기화 | O (thread-safe) | X |
| 성능 | 상대적으로 느림 | 상대적으로 빠름 |
| 등장 시기 | Java 1.0 | Java 1.2 |
Vector의 모든 메서드는 synchronized 키워드가 붙어 있다. 여러 스레드가 동시에 접근하더라도 한 번에 하나의 스레드만 처리하도록 잠금이 걸린다. 덕분에 멀티스레드 환경에서도 안전하게 동작한다.
반면 ArrayList는 동기화 처리가 없어서 더 빠르다. 단일 스레드 환경에서는 ArrayList가 낫다.
사용법은 ArrayList와 거의 동일하다.
Vector<String> v = new Vector<>();
v.add("사과");
v.add(0, "포도"); // 특정 위치에 삽입
v.get(0); // 인덱스로 조회
v.set(1, "망고"); // 수정
v.remove(0); // 인덱스로 삭제
v.size(); // 크기
v.contains("딸기"); // 포함 여부
v.clear(); // 전체 삭제
Vector에만 있는 구식 메서드도 있다. addElement(), elementAt(), removeElement() 같은 것들인데, 지금은 쓰지 않는다. ArrayList와 동일한 add(), get(), remove()를 쓰면 된다.
솔직히 말하면, 요즘은 거의 쓰지 않는다.
멀티스레드 환경에서 안전한 리스트가 필요하다면 Collections.synchronizedList()로 ArrayList를 감싸거나, java.util.concurrent 패키지의 CopyOnWriteArrayList를 쓰는 게 더 현대적인 방식이다.
import java.util.Collections;
import java.util.ArrayList;
import java.util.List;
// ArrayList를 동기화된 리스트로 감싸기
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
Vector는 레거시 코드(예전에 작성된 코드)에서 마주칠 수 있는 클래스라고 이해하면 된다. 새로 작성하는 코드에서는 ArrayList를 기본으로 쓰자.
Vector는 ArrayList의 전신이다. 동기화가 기본으로 걸려 있다는 점이 유일한 차이인데, 그 때문에 성능이 느리다. 지금 새로 코드를 짠다면 ArrayList를 쓰고, 멀티스레드가 필요한 경우엔 더 나은 대안이 따로 있다는 걸 기억해두면 된다.