- Java 컬렉션 프레임워크에서
List
인터페이스를 구현한 컬렉션 클래스
: 데이터의 저장 순서를 유지하고, 데이터의 중복을 허용- Object 배열을 이용해서 데이터를 순차적으로 저장하고,
이 배열이 포화 상태면 보다 더 큰 새로운 배열을 생성한 후 기존 배열의 데이터를 복사하여 저장- 기존의 Vector 클래스를 개선
: 구현 원리와 기능의 측면에서, ArrayList는 Vector와 동일
cf1) Vector 클래스는 기존의 Stack 클래스 등과의 호환성을 위해 남겨둔 것에 불과하기 때문에, 현재는 Vector 클래스 대신 ArrayList 클래스를 사용하는 것이 권장됨
cf2) Vector 클래스의 주요 메서드는 여기에서 확인 가능
java.util.ArrayList의 상위 인터페이스(Java 17 기준)
java.util.Iterable
- 이 인터페이스를 상속받은 인터페이스나 클래스는
for-each
를 사용한 순회가 가능
java.util.Collection
- 그룹화된 데이터에 관해 공통적으로 사용되는 기능을 정의한 인터페이스
- List, Set, Queue 등으로 세분
java.util.List
- 리스트의 핵심 기능을 정의한 인터페이스
java.util.RandomAccess
- 이 인터페이스를 구현한 클래스의 인스턴스는 빠른(일반적으로 시간복잡도가
O(1)
인) 무작위 접근을 수행할 수 있음- 마커 인터페이스에 해당
: 객체에 관한 추가 정보를 제공하기 위해 사용되는 빈 인터페이스
java.io.Serializable
- 이 인터페이스를 구현한 클래스의 인스턴스는 직렬화를 수행할 수 있음
java.lang.Clonable
- 이 인터페이스를 구현한 클래스의 인스턴스는
Object.clone()
메서드에 의한 복제 가능
cf) 마커 인터페이스: 클래스에 관한 추가 정보를 제공하는 용도로 사용되는 빈 인터페이스
java.util.ArrayList의 상위 클래스
ArrayList
의 메서드는 아래의 추상 클래스에서 정의된 메서드들을 오버라이딩
java.util.AbstractCollection
Collection
의 기본 골격을 제공하기 위한 추상 클래스Collection
인터페이스에서 정의된 주요 기능들을 구현
java.util.AbstractList
List
의 기본 골격을 제공하기 위한 추상 클래스List
인터페이스에서 정의된 주요 기능들을 구현
cf) List 인터페이스와 Collection 인터페이스에서 이미 정의된 부수적인 메서드는 제외
(두 인터페이스에 정의된 주요 메서드는 여기에서 확인 가능)
ArrayList()
- 초기 용량이 10이고 크기가 0인 ArrayList를 생성
ArrayList(int capacity)
- 인자로 지정된 값을 초기 용량으로 갖는, 크기가 0인 ArrayList를 생성
ArrayList(Collection c)
- 인자로 지정한 컬렉션의 요소를 해당 컬렉션에 저장된 순서대로 포함하는 ArrayList를 생성
객체 추가/삽입 보조용 메서드
cf) java.util.ArrayList
에서 객체의 추가/삽입 작업을 내부적으로 보조하기 위한 메서드
(접근제어자는 모두 private
)
private Object[] grow(int minCapacity)
- ArrayList에 더 이상 객체를 추가할 수 없을 때,
지정한 최소 용량만큼 데이터를 저장할 수 있도록 최대 용량을 기존의 1.5배로 갱신
private void add(Object e, Object[] elementData, int s)
- ArrayList에 저장된 객체의 개수가 최대 용량에 도달하면,
그 용량을 증가시킨 새로운 객체 배열에 기존 객체들을 복사한 후 데이터를 추가
단일 객체 추가/삽입 메서드
boolean add(Object e)
- 리스트의 끝에 새로운 객체를 추가
void add(int index, Object element)
- ArrayList의 지정된 위치에 지정한 객체를 삽입
- 지정한 위치 이후의 모든 객체는 오른쪽으로 1칸씩 이동
- ArrayList가 이미 꽉 찬 경우, 내부적으로 그 용량을 증가시킨 후 지정한 객체를 삽입
컬렉션 단위 추가/삽입 메서드
boolean addAll(Collection c)
- 지정된 컬렉션의 모든 객체를 ArrayList에 저장
boolean addAll(int index, Collection c)
- 지정된 위치부터 주어진 컬렉션의 모든 객체를 ArrayList에 저장
객체 삭제 보조용 메서드
private void fastRemove(Object[] es, int i)
- 지정한 위치의 바로 다음 위치부터 맨 끝까지의 객체들을 왼쪽으로 모두 1칸씩 이동
- ArrayList의 크기는 1 감소하고, 기존의 마지막 객체는 null로 변경
- ArrayList의 삭제 기능의 핵심 로직
단일 객체 삭제 메서드
Object remove(int index)
- 지정한 위치에 저장된 객체를 ArrayList에서 삭제한 후, 삭제된 데이터를 반환
boolean remove(Object o)
- ArrayList의 첫번째 요소부터 차례대로 탐색하여 지정한 객체의 위치를 찾아서 해당 객체를 삭제
컬렉션 단위 삭제 메서드
boolean removeAll(Collection c)
- 지정한 컬렉션에 포함된 객체들을 ArrayList에서 제거
- 차집합 연산과 유사
boolean retainAll(Collection c)
- 지정한 컬렉션에 포함되지 않은 객체들을 ArrayList에서 제거
- 교집합 연산과 유사
단일 데이터 조회 메서드
Object get(int index)
- 지정된 위치에 저장된 객체를 ArrayList에서 찾아서 반환
데이터 군(群) 조회 메서드
List subList(int fromIndex, int toIndex)
- fromIndex부터 toIndex 사이에 저장된 객체를 반환
데이터 위치 검색 메서드
int indexOf(Object o)
- ArrayList의 첫번째 요소부터 순방향으로 탐색하여 지정된 객체의 위치를 반환
int lastIndexOf(Object o)
- ArrayList의 마지막 요소부터 역방향으로 탐색하여 지정된 객체의 위치를 반환
Object set(int index, Object element)
- ArrayList에서 지정된 위치에 저장된 객체를 객체 element로 변경
ArrayList의 크기와 용량
크기(size)
- 컬렉션에서 현재 저장하고 있는 객체의 개수
용량(capacity)
- 컬렉션에 객체를 최대로 저장 가능한 한도
리스트 용량 조절 메서드
void ensureCapacity(int minCapacity)
- ArrayList의 용량이 최소한 minCapacity가 되도록 변경
void trimToSize()
- ArrayList의 용량이 현재 크기와 같아지도록 빈 공간을 제거
Object clone()
- 기존 ArrayList의 복제본을 생성
java.util.ArrayList
는Cloneable
인터페이스를 구현한 클래스이므로 이 메서드를 사용 가능