개발공부/JAVA

[JAVA] List 컬렉션 - ArrayList, Vector, LinkedList

jnnjnn 2024. 3. 18. 18:16

List 컬렉션

List 컬렉션은 객체를 인덱스로 저장, 관리한다. List 컬렉션에는 ArrayList, Vector, LinkedList 등이 있으며 List 컬렉션에서 공통으로 사용 가능한 List 인터페이스 메소드는 다음과 같다.

 

기능 메소드 설명
객체 추가 boolean add(E e) 주어진 객체를 맨 끝에 추가
void add(int index, E element) 주어진 인덱스에 객체를 추가
set(int index, E elemetn) 주어진 인덱스의 객체를 새로운 객체로 변경
객체 검색 boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부
E get(int index) 주어진 인덱스에 저장된 객체를 리턴
isEmpty() 컬렉션이 비어 있는지 조사
int size() 저장되어 있는 전체 객체 수를 리턴
객체 삭제 void clear() 저장된 모든 객체를 삭제
E remove(int index) 주어진 인덱스에 저장된 객체를 삭제
boolean remove(Object o) 주어진 객체를 삭제

 

 

ArrayList

List 컬렉션에서 가장 많이 사용하는 컬렉션이다. ArrayList에 객체를 추가하면 내부 배열에 객체가 저장된다. 일반 배열과는 달리 제한 없이 객체를 추가할 수 있으며 리스트 길이를 정하지 않고도 생성할 수 있다.

List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 저장한다. 또한 동일한 객체를 중복 저장할 수 있는데, 이 경우에는 동일한 번지가 저장된다. null 또한 저장이 가능하다.

 

ArrayList 컬렉션에 객체를 추가하면 인덱스 0번부터 차례대로 저장된다. 특정 인덱스의 객체를 삽입하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 밀려난다. 마찬가지로 특정 인덱스에 객체를 제거하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 당겨진다.

 

따라서 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList 보다는 LinkedList를 사용하는 것이 좋다.

 

배열과 ArrayList

 

배열

- 처음 선언한 배열의 길이는 변경할 수 없다 (정적 할당 : static allocation)

- index에 위치한 하나의 데이터(element)를 삭제하더라도 해당 index는 빈 공간으로 남는다

 

ArrayList

- 리스트의 길이가 가변적이다 (동적 할당 : dynamic allocation)

- 데이터(element) 사이에 빈 공간을 허용하지 않는다

 

 

Vector

Vector는 ArrayList와 동일한 내부 구조를 가지고 있다. 차이점은 Vector는 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 Vector() 메소드를 실행할 수 없다는 것이다. 그렇기 때문에 멀티 스레드 환경에서는 안전하게 객체를 추가 또는 삭제할 수 있다.

 

LinkedList

LinkedList는 ArrayList와 사용 방법은 동일하지만 내부 구조는 완전히 다르다. ArrayList는 내부 배열에 객체를 저장하지만, LinkedList는 인접 객체를 체인처럼 연결해서 관리한다.

 

LinkedList는 특정 위치에서 객체를 삽입하거나 삭제하면 바로 앞뒤 링크만 변경하면 되므로 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 좋은 성능을 발휘한다.

 

단, 데이터(element)에 접근하는 경우 ArrayList는 무작위 접근(random access)가 가능하지만 LinkedList는 순차 접근(sequential access)만이 가능하다. 따라서 데이터를 수정하지 않고 접근하기만 한다면 LinkedList보다 ArrayList를 사용하는 것이 좋다.