Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java) ArrayList와 Vector의 차이점 완벽 비교

자바에서 리스트를 다룰 때 가장 많이 사용되는 클래스는 ArrayListVector입니다. 두 클래스 모두 List 인터페이스를 구현하는 가변 크기 배열 기반 자료구조라는 공통점이 있지만, 내부 동작 방식과 스레드 처리 측면에서 중요한 차이가 있습니다. 이 글에서는 두 클래스의 차이점을 항목별로 자세히 살펴보겠습니다.

ArrayList란?

ArrayList는 JDK 1.2부터 도입된 컬렉션 프레임워크의 대표적인 리스트 구현체로, 단일 스레드 환경에서 높은 성능을 발휘하도록 설계되었습니다.

ArrayList의 주요 특징

  • 비동기화(Non-synchronized): 여러 스레드가 동시에 접근해도 별도의 잠금 처리를 하지 않습니다.

  • 스레드에 안전하지 않음: 멀티스레드 환경에서 동시 수정 시 데이터 불일치가 발생할 수 있으므로, 외부에서 직접 동기화 처리가 필요합니다.

  • 빠른 성능: 동기화 오버헤드가 없기 때문에 Vector에 비해 실행 속도가 빠릅니다.

  • 용량 증가 방식: 저장된 요소 수가 현재 용량을 초과하면 배열 크기를 기존 크기의 50%만큼 증가시킵니다.

  • 순회 방식: 요소를 탐색할 때 Iterator 인터페이스만 사용할 수 있습니다.

ArrayList 사용 예제

ArrayList<T> al = new ArrayList<T>();

Vector란?

Vector는 JDK 1.0부터 존재했던 레거시(Legacy) 클래스로, 멀티스레드 환경을 고려하여 설계된 동기화 리스트입니다.

Vector의 주요 특징

  • 동기화(Synchronized): 모든 메서드에 잠금(lock)이 적용되어 있어 여러 스레드가 안전하게 접근할 수 있습니다.

  • 스레드에 안전함: 하나의 스레드가 객체의 잠금을 점유하는 동안 다른 스레드는 실행 가능(runnable) 또는 대기(non-runnable) 상태에서 기다리게 됩니다.

  • 느린 성능: 모든 작업마다 동기화 처리가 이루어지므로 ArrayList에 비해 속도가 느립니다.

  • 용량 증가 방식: 저장된 요소 수가 현재 용량을 초과하면 배열 크기를 기존 크기의 100%만큼 증가시킵니다.

  • 순회 방식: IteratorEnumeration 인터페이스를 모두 사용해 요소를 탐색할 수 있습니다.

  • 사용 권장 환경: 멀티스레드 환경에서는 스레드 안전성 덕분에 ArrayList보다 유리합니다. 반면 단일 스레드 환경에서는 일반적으로 ArrayList가 더 좋은 선택입니다.

Vector 사용 예제

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

ArrayList vs Vector 한눈에 비교하기

구분ArrayListVector
동기화 여부비동기화동기화
스레드 안전성안전하지 않음안전함
성능빠름느림
용량 증가율50% 증가100% 증가
순회 방식IteratorIterator, Enumeration
도입 시기JDK 1.2JDK 1.0 (레거시)

정리

결론적으로, 단일 스레드 환경이라면 ArrayList를, 여러 스레드가 동시에 접근하는 환경이라면 Vector를 사용하는 것이 적합합니다. 다만 최신 자바 개발에서는 Vector 대신 Collections.synchronizedList()CopyOnWriteArrayList 같은 대안을 활용하는 경우도 많으니, 프로젝트의 요구 사항에 맞게 선택하는 것이 좋습니다.