http://www.javaworld.com/javaworld/javaqa/2001-06/03-qa-0622-vector.html 
원문

번역은 아니고 중요한 부분만 정리합니다.

Vector와 ArrayList중에서 어느게 더 좋은가요?
일단 Vector(이하 V)와 ArrayList(이하 A)는  양쪽 모두 AbstractList를 상속하고 List<E>, RandomAccess, Cloneable, java.io.Serializable를 구현합니다.
http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html 
http://docs.oracle.com/javase/6/docs/api/java/util/Vector.html 

게다가 소스코드를 열어보면 둘다 배열을 이용하여 구현이 되어있습니다.

그러면 무슨 차이가 있길래 두가지의 클레스가 사용되는건지 알아보곘습니다.
 
동기화
일단 V는 Thread를 이용한 동시성에 대해서 안전합니다. 따라서 쓰레드를 이용해서 동시 접근이 되는 구조라면 V를 이용해야하겠지만 쓰레드를 사용하지 않는 상황에서 V를 이용하는것은 syncronized 때문에 성능상 손실을 가져다 주기 때문에 쓰레드를 사용하지 않는다면 ArrayList가 좋습니다.

데이터 증가
위에서 말했듯이 A와 V는 양쪽 모두 배열을 사용하여 구현된 리스트이고 내부에 가지고 있는 배열의 크기보다 많은 양의 데이터가 저장되면 현재 배열보다 큰 배열을 만든뒤 새로운 배열에 현재 내용을 복사하고 그 새로운 배열을 기본으로 사용하게 됩니다.
이때 배열의 크기를 늘린다는 현상이 발생하는데 둘다 ensureCapacity 라는 메소드를 이용해서 크기를 늘리는데 이때 V는 크기를 2배로 늘리고 A는 1.5배를 합니다. 
입력되는 자료의 수는 항상 알수 있는것이 아니기 때문에 배열의 크기를 초기화 하기가 쉽지 않습니다. 따라서 입력할수 있는 최대의 크기로 A나 V를 만들게 되면 메모리 공간의 낭비가 생기기 때문에 좋은 방법이 아니고 필요에 따라서 크기를 증가 시켜줘야 하는데 지속적으로 데이터가 추가가 된다면 V가 조금 더 나은 성능을 보이긴 하겠지만 대단히 큰 차이라고 보여지지는 않습니다. 상황에 따라서 알맞는 증가율을 가진 녀석을 사용하거나 상속을 통해서 ensureCapacity 메소드를 오버라이드 해주는 것도 방법중 하나라고 하겠습니다.
하지만 A는 데이터의 배열이 private이기 때문에 상속해도 소용이 없고 V의 경우는 protected 이기 때문에 조절을 해줄수 있겠네요

사용패턴
A와 V 둘다 배열을 사용하기 때문에 배열과 거의 유사한 특징을 가지고 있습니다.
인덱스를 이용해서 데이터를 가져오는데는 O(1)의 복잡도를 가지고 어떤 위치에 데이터를 입력하는데도 O(1)의 복잡도를 가집니다.
하지만 데이터를 삭제하거나 중간에 삽입 하는데는 O(n) (n은 자료의 수) 의 복잡도를 가지게됩니다.

하지만 LinkedList의 경우에는 인덱스를 이용한 데이터의 입력, 출력, 삭제 등은 O(n)의 복잡도를 가지지만 이터레이터를 이용했을때는 O(1)의 복잡도를 가집니다.

어떤것을 순차적으로 검색한뒤에 삭제, 삽입, 변경등을 할일이 많다면 LinkedList 가 좋을것이고
삭제나 삽입이 없는 패턴으로 사용한다면 A나 V 둘중 하나를 골라서 쓰면 되겠습니다. 

'Programming > Java' 카테고리의 다른 글

자바 숏코딩  (0) 2012.10.25
알파 체널을 통해서 이미지를 폴리곤으로 만들기  (0) 2012.01.19
'필드'이지만 '메서드'처럼 사용됩니다.  (2) 2012.01.03
"".equals ?  (0) 2011.12.21
초간단 원형 링크 리스트  (0) 2011.11.23
Posted by 동적할당
: