리스트 - java.util.ArrayList

이현빈·2025년 2월 24일
0

1. java.util.ArrayList 개괄

  • 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 인터페이스에서 정의된 주요 기능들을 구현

2. java.util.ArrayList의 메서드

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.ArrayListCloneable 인터페이스를 구현한 클래스이므로 이 메서드를 사용 가능

Reference

0개의 댓글