본문 바로가기

Java/기본

[Java] 컬렉션프레임워크102 - List 컬렉션 - ArrayList, LinkedList, Vector

List 개요

배열과 비슷한 방식으로 데이터를 관리한다. 즉 데이터 순서에 따른 index를 부여해 index를 통한 데이터 접근이 가능하다. 배열은 생성 후에는 크기가 고정되어 배열크기값보다 더 많은 데이터를 넣을 수 없는데 반해, List는 생성후에도 저장용량을 변동시킬 수 있기 때문에 원래 설정된 값보다 더 많은 데이터를 넣을 수 있다. 크기는 자동으로 증가한다.

List 는 객체 자체를 저장하지 않고 객체의 번지를 참고하기 때문에 동일한 객체를 중복하여 저장할 수 있다. 동일한 객체를 저장하는 경우 동일한 주소를 참조하도록 설계되었다. null도 요소로 저장될 수 있으며 이 경우에는 주소값으로 참조되는 값은 없다.

 

 

주요 메서드

메서드 내용
boolean add(E e) List 마지막에 요소를 추가하기
void add(int index, E element) index에 요소를 추가하기
void clear() List의 모든요소 삭제하기
boolean contains(Object o) 해당 요소를 가지고 있는지 여부
boolean equals(Object o) 동일한 List인지 여부
E get(int index) index번째의 요소 가져오기
int indexOf(Object o) 몇 번째 인지 가져오기
boolean isEmpty() List의 요소가 비었는지 여부
Iterator<E> iterator() 반복자 가져오기
int lastIndexOf(Object o) 특정 요소의 마지막 인덱스, 없으면 -1 반환
ListIterator<E> listIterator() ListIterator 가져오기
E remove(int index) 특정 인덱스의 요소 삭제
E set(int index, E element) 특정 인덱스의 요소를 교체하기
int size() List의 크기 가져오기
default void sort(Comparator<? super E> c) Comparator 기준대로 List 정렬
Object[] toArray() List 순서대로 정렬된 배열 리턴

 


ArrayList

검색을 하거나 마지막 인덱스에 요소를 추가하는 경우에 우수한 성능을 보이는 List의 구현 클래스이다.

내부 배열에 객체를 저장하는 방법으로 작동한다.

 

  • ArrayList의 상속구조

 

ArrayList 생성

List list01 = new ArrayList();
List<String> list02 = new ArrayList<String>();
List<Integer> list03 = new ArrayList<>();

list01의 경우 타입 파라미터를 생략하였다.

list03의 경우 ArrayList 의 타입 파라미터를 생략하였다. 이 경우 List의 타입 파라미터와 동일하게 설정된다.

 

 

기본생성자로 ArrayList를 생성하는 경우 내부에 초기 용량(capacity)로 10만큼 설정된다. ArrayList 에 객체 추가시 자동으로 마지막에 index 에 추가되며, 용량이 부족한 경우 자동으로 용량이 커진다. 특정 index에 추가하는 경우 뒤쪽 인덱스의 요소들이 모두 추가된 만큼 인덱스가 밀리게 된다. 마찬가지로 특정 index의 요소를 삭제하는 경우 뒤쪽 인덱스의 요소들이 모두 삭제된 인덱스 만큼 당겨지게 된다.

 

때문에 List 조작이 빈번하고, 특히 작업이 앞쪽에 집중된 경우 시간이 상대적으로 많이 소요될 수 있다.

 


Vector

ArrayList 와 동일한 기능을 제공한다. 단, 멀티스레드를 지원한다는 기능만 차이가 있다.

Vector의 메서드는 동기화(synchronized) 기능이 포함되어있다.

 


LinkedList

List 중간에 요소를 추가, 삭제하는 등 List 검색보다는 조작에 우수한 성능을 보이는 List의 구현 클래스이다.

인접 참조를 링크하는 구조로서 마치 사슬과 같은 구조로 작동한다. LinkedList 는 특정 인덱스에 객체가 추가 혹은 삭제되는 경우 해당 객체의 앞뒤로 연결된 사슬만 새로 교체하는 방식으로 구동된다. 때문에 List 의 특정 인덱스 작업(추가 혹은 삭제)와 앞뒤 인덱스 새로 연결작업만 이루어지기 떄문에 객체3개만 건드리게 된다. (마지막 인덱스가 아닌 곳에서) 객체 추가, 삭제가 빈번한 경우 LinkedList가 우수한 성능을 보인다.