ArrayList

참고 링크

https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html

https://docs.oracle.com/javase/8/docs/api/java/util/RandomAccess.html

ArrayList

java.lang.Object
    java.util.AbstracCollection<E>
        java.util.AbstractList<E>
            java.util.ArrayList<E>
  • Object -> Collection -> List -> ArrayList 순으로 확장한 것을 확인할 수 있다.

Serializable : 직렬화 여부 판단. 원격으로 객체를 전송, 파일 I/O 가능

Cloneable : Object 클래스의 clone() 메서드 사용여부 판단.

Iterable<E> : forEech 구문 사용 가능

Collection<E> : 여러개의 데이터를 한 객체에 담아 처리할 메소드 지정

List<E> : 순서가 보장되며, 중복을 허용하는 목록형 데이터 집합을 의미

RandomAccess :

  • 컬렉션이 인덱스 기반으로 빠른 임의 접근(Random Access) 을 지원한다는 신호를 제공하는 역할을 한다.

  • 즉, ArrayList 같은 컬렉션은 인덱스를 사용한 요소 접근(get(index) 또는 set(index, value))이 상수 시간(O(1)) 안에 이루어진다는 것을 나타냅니다.

  • RandomAccess 는 마커 인터페이스이다.

마커 인터페이스(Mark Interface)

  • Java에서 마커 인터페이스는 구체적인 메서드를 포함하지 않으며, 특정 클래스가 어떤 기능을 가지고 있음을 표시하기 위해 사용 (정보성)

  • 즉 마커 인터페이스는 정보성이지, 기능을 가지고 있는 것이 아니다. (빼도 기능적으로 문제는 없다)

생성자

  • ArrayList() : 객체를 저장할 공간이 10개인 ArrayList 객체를 만든다.

    • 10 이상의 데이터가 들어가면 크기를 늘리는 작업이 ArrayList 내부에서 자동으로 수행된다. -> 객체가 생성될 때 배열이 생성되는 것이 아닌, 첫 번째 요소가 추가될 때 크기가 10인 배열이 생성된다.

    • 또한 크기가 다 차면 1.5배씩 배열의 크기는 증가한다. -> 해당 작업은 애플리케이션 성능에 영향을 주는 작업으로, 크기가 예상이 된다면 초기에 지정해주는 것이 좋다.

  • ArrayList(Collection<? extend E> c) : 매개변수로 넘어온 컬렉션 객체가 저장되어 있는 ArrayList를 만든다.

  • ArrayList(int initialCapacity) : 매개변수만큼의 저장공간을 갖는 ArrayList 를 만든다.

데이터를 담자

  • boolean add(E e) : 매개변수로 들어온 데이터를 가장 끝에 담는다.

  • void add(int index, E e) : 매개변수로 들어온 데이터를 지정된 index 위치에 담는다.

    • 해당 위치에 데이터를 추가하게 되면, 뒤의 데이터는 복사가 일어나게 된다. -> ArrayList 의 가장 큰 문제점이다.

  • boolean addAll(Collection<? extends E> c) : 매개변수로 넘어온 컬렉션 데이터를 가장 끝에 담는다.

    • Collection 관련 객체를 복사할 일이 있을 때에는, 생성자 혹은 addAll() 메서드를 사용하는 것이 좋다.

  • boolean addAll(int index, Collection<? extend E> c) : 매개변수로 넘어온 컬렉션 데이터를 index 에 지정된 위치부터 담는다.

데이터를 꺼내자

  • Int size() : Collection 을 구현한 객체에 들어가 있는 데이터의 갯수 리턴.

    • 배열.length 는 배열의 저장 공간 개수를 의미하지만,

    • size() 메서드는 객체 안에 들어가 있는 데이터의 갯수를 의미한다.

  • E get(int index) : 매개변수에 지정한 위치에 있는 데이터 리턴.

  • int indexOf(Object o) : 매개변수로 지정한 객체와 동일한 데이터의 위치를 리턴.

  • int lastInedexOf(Object o) : 매개변수로 지정한 객체와 동일한 마지막 데이터의 위치를 리턴.

데이터를 삭제하자

  • void clear() : 모든 데이터 삭제

  • E remove(int index) : 매개 변수에서 지정한 위치에 있는 데이터를 삭제하고 삭제한 데이터를 리턴

  • boolean remove(Object o) : 매개 변수에 넘어온 객체와 동일한 첫 번째 데이터를 삭제

  • boolean removeAll(Collection<?> c) : 매개변수로 넘어온 컬렉션 객체에 있는 데이터와 동일한 모든 데이터를 삭제

ArrayList 를 배열로 변경

  • Object[] toArray() : Object 타입의 배열로 반환

    • Object 타입으로 받기 때문에, 형 변환이 필요하다.

  • <T> T[] toArray(T[] a) : 특정 타입의 배열로 변환 (일반적으로 많이 사용하는 방법)

    • 원하는 타입을 지정해 줄 수 있기 떄문에, 형 변환이 필요하지 않다.

    • 전달된 배열의 크기가 ArrayList 의 크기 보다 작으면 새로운 배열이 생성된다.

    • 제공된 배열의 크기가 적절한 경우에는 기존 배열이 사용된다.

데이터를 변경

  • E set(int index, E element) : 지정한 위치에 해당 객체로 바꿔친다.

동기화 처리하기

  • ArrayList 를 멀티 쓰레드 환경에서 사용할 수 있도록 Collections.synchronizedList() 메서드가 제공된다.

  • 아래 코드와 같이 컬렉션 내 많은 객체를 동기화 처리 해준다.

ArrayList 시간 복잡도(CRUD)

생성

  • 최선 : O(1)

    • 요소가 배열의 끝에 추가되고, 배열의 크기 조절이 필요 없는 경우

  • 최악 : O(n)

    • 배열이 가득 차서 새로운 배열을 생성하고 기존 요소를 복사해야 하는 경우

읽기

  • 최선 : O(1)

    • 인덱스를 통해서 배열에 접근하기에 항상 O(1) 이다.

  • 최악 : O(1)

수정

  • 최선 : O(1)

    • 인덱스를 통해서 배열에 접근하기에 항상 O(1) 이다.

  • 최악 : O(1)

삭제

  • 최선: O(1)

    • 삭제하려는 요소가 배열의 마지막 요소일 때, 삭제 후 배열 크기를 줄이지 않으므로 O(1)입니다.

  • 최악: O(n)

    • 삭제하려는 요소가 배열의 중간에 위치할 때, 삭제 후 뒤에 있는 요소들을 앞으로 이동시켜야 하므로 O(n)입니다.

Last updated