본문 바로가기
자바/자바 자료구조

자바 - List - ArrayList 뽀개기 - 1

by 신재은👩🏼‍💻 2024. 4. 14.

ArrayList는 Java Collections Framework의 일부로, List 인터페이스를 구현하는 동적 배열이다.

ArrayList는 요소를 배열로 관리하며, 배열이 꽉 찼을 때 자동으로 크기를 늘린다.

이는 Java에서 가장 많이 사용되는 컬렉션 중 하나로, 데이터를 인덱스 기반으로 접근할 수 있어 임의 접근(random access)이 빠르다.

요약: 길이가 변하는 동적 '배열'. 배열이 다 차면 자동으로 커진다. index 사용이 가능하다.

 

ArrayList의 핵심 특징

  1. 동적 배열 구현: 위에 언급함.
  2. 데이터 접근: 인덱스 덕에 검색에서는 O(1)이다. 배열의 끝에 데이터를 추가하거나 삭제해도 평균적으로 O(1)이다. 중간에 데이터를 추가 또는 삭제하면 O(n)이다. 여기서 n은 해당 배열에 있는 '모든 데이터'가 아니다. 이동해야 하는 요소의 수다. '대충' 이렇게 알아도 무방하다.
  3. 용량과 크기의 개념:
    1. 크기(size): 리스트에 실제로 저장된 요소의 수입니다.
    2. 용량(capacity): 내부 배열의 크기로, ArrayList에 저장할 수 있는 요소의 최대 수입니다. 용량은 필요에 따라 자동으로 증가하지만, 수동으로 조정하는 것도 가능하다. 
  4. 메모리 관리: 초기 용량을 설정하지 않으면 ArrayList는 기본적으로 10개의 요소를 저장할 수 있는 배열을 생성한다. 요소 추가 시 배열이 꽉 차면, 새로운 배열을 생성하여 기존 요소들을 새 배열로 복사하고, 기존 배열은 가비지 컬렉션의 대상이 된다. 이 과정에서 기본적으로 배열의 크기는 약 1.5배 증가한다.

주요 생성자와 메서드

  • 생성자:
    • ArrayList(): 기본 생성자는 초기 용량을 10으로 설정한다.
    • ArrayList(int initialCapacity): 초기 용량을 지정하여 ArrayList를 생성한다.
    • ArrayList(Collection<? extends E> c): 주어진 컬렉션의 요소로 ArrayList를 초기화한다.
  • 주요 메서드:
    • add(E e): 리스트의 끝에 요소를 추가한다.
    • add(int index, E element): 지정된 인덱스에 요소를 추가한다.
    • remove(int index): 지정된 인덱스의 요소를 삭제하고 반환한다.
    • remove(Object o): 첫 번째로 나타나는 특정 요소를 삭제한다.
    • get(int index): 지정된 인덱스의 요소를 반환한다.
    • set(int index, E element): 지정된 인덱스에 요소를 설정(교체)한다.
    • clear(): 리스트의 모든 요소를 삭제한다.
    • size(): 리스트의 요소 수를 반환한다.
    • isEmpty(): 리스트가 비어 있는지 확인한다.

사용 시 고려사항

  • 동시 수정 문제: ArrayList는 스레드 안전하지 않다. 멀티스레드 환경에서는 Collections.synchronizedList 메서드를 사용하여 스레드 안전한 리스트로 변환하거나, Vector 클래스를 사용할 수 있다.
  • 성능 최적화: 빈번한 크기 조정을 피하기 위해 가능한 예상되는 최대 요소 수에 가까운 초기 용량을 지정하는 것이 좋다.