[JAVA] List 컬렉션 클래스에 대하여
List 컬렉션 클래스
List 컬렉션 클래스는 List 인터페이스를 구현한 클래스이다.
List 컬렉션 클래스는 객체를 순차적으로 저장한다.
객체를 인덱스로 관리하기 때문에 List 컬렉션에 객체를 추가하면 인덱스가 자동으로 부여된다.
이 인덱스를 이용해 객체를 검색하고 삽입, 삭제할 때 사용한다.
이러한 List 컬렉션은 요소의 저장 순서가 유지되고, 같은 요소의 중복 저장을 허용한다는 특징을 가진다.
List 인터페이스에서 공통적으로 제공하는 주요 메서드는 다음과 같다.
메서드 | 설명 |
boolean add(E e) | 해당 리스트(list)에 전달된 요소를 추가 |
void add(int index, E e) | 해당 리스트의 특정 위치에 전달된 요소를 추가 |
void clear() | 해당 리스트의 모든 요소를 제거 |
boolean contains(Object o) | 해당 리스트가 전달된 객체를 포함하고 있는지를 확인 |
boolean equals(Object o) | 해당 리스트와 전달된 객체가 같은지를 확인 |
E get(int index) | 해당 리스트의 특정 위치에 존재하는 요소를 반환 |
boolean isEmpty() | 해당 리스트가 비어있는지를 확인 |
Iterator<E> iterator() | 해당 리스트의 반복자(iterator)를 반환 |
boolean remove(Object o) | 해당 리스트에서 전달된 객체를 제거 |
boolean remove(int index) | 해당 리스트의 특정 위치에 존재하는 요소를 제거 |
E set(int index, E e) | 해당 리스트의 특정 위치에 존재하는 요소를 전달받은 객체로 대체 |
int size() | 해당 리스트의 요소의 총 개수를 반환 |
Object[] toArray() | 해당 리스트의 모든 요소를 Object 타입의 배열로 반환 |
이외에도 List 인터페이스를 구현하는 List 컬렉션 클래스들에 대해서 알아보자.
ArrayList 클래스
ArrayList 클래스는 List 컬렉션 클래스 중 가장 많이 사용되는 클래스 중 하나이다. ArrayList 클래스는 내부적으로 배열을 이용하여 요소를 저장한다. 하지만 배열은 크기를 변경할 수 없기 때문에 크기를 늘리기 위해서 새로운 배열을 생성하여 기존의 데이터들을 옮겨야 한다. 따라서 데이터의 추가 및 삭제에 시간이 길어지는 단점이 존재한다.
ArrayList 사용법 예제1)
// ArrayList 생성 및 초기화
ArrayList<String> list = new ArrayList<>();
// String 객체 저장
list.add("Hello");
// 인덱스 값을 이용해 객체 삭제
list.remove(0);
배열과 다른 점이 있다면, 배열은 처음 생성할 때 고정 크기를 지정하기 때문에 사용 중에 크기를 변경할 수 없다. 하지만 ArrayList는 사용 중에 크기를 변경할 수 있다.
ArrayList는 기본 저장 용량을 정의하고 있다. 위에서 볼 수 있듯이 기본 용량은 10으로 설정되어 있는데, 만약 10개가 넘는 데이터가 들어오게 되면 자동으로 더 큰 저장 용량을 가진 ArrayList를 생성하고 모든 원소를 복사해서 옮기는 과정이 일어난다.
또한, ArrayList는 내부적으로 배열을 사용하기 때문에 특정 인덱스의 객체를 제거하면, 제거한 객체의 인덱스부터 마지막 인덱스까지 1칸식 앞으로 이동시켜야 한다. 객체를 추가할 때도 마찬가지의 상황이 발생한다. 따라서 객체의 삭제와 삽입이 빈번하게 일어나는 상황에서는 ArrayList의 사용이 불리한 점이 있을 수 있다.
Vector 클래스
Vector는 ArrayList와 내부적으로 동일하다. 하지만 ArrayList와 다르게 Thread-safe 하다. 즉, 멀티 스레딩 환경에서 안전하게 객체를 추가, 삭제할 수 있다는 차이점이 존재한다.
Vector 클래스는 동기화된(Synchronized) 메서드로 구성되어 있기 때문에 Thread-safe 하지만, ArrayList 보다 객체를 추가, 삭제하는 과정이 느리다. 따라서 안전성을 추구하지만 속도는 느린 클래스라고 할 수 있다.
동기화 문제에 대해 잘 모른다면 다음을 참고하자.
LinkedList 클래스
LinkedList는 ArrayList 클래스가 배열을 이용하여 발생하는 단점을 극복하기 위해 고안됐다.
LinkedList는 내부적으로 연결 리스트를 이용하여 요소를 저장한다.
연결 리스트에 대해 잘 모른다면 다음을 참고하자.
연결 리스트는 저장된 요소들 사이를 링크(link)로 연결하여 구성한다. 따라서 연결 리스트에서는 원소를 삭제하더라도 제거되는 인덱스의 앞, 뒤 링크만 변경되고 나머지는 변경되지 않는다. 따라서 ArrayList보다 객체를 삽입, 삭제하는 데 있어 성능상에 유리한 점이 존재한다.
참고
1. http://www.tcpschool.com/java/java_collectionFramework_list
3. https://docs.oracle.com/javase/8/docs/api/org/w3c/dom/Document.html