[기본 개념] 6 | (1.2) ArrayList

728x90

[기본 개념] 6 | (1.2) ArrayList

1 컬렉션 프레임웍의 핵심 인터페이스

2> ArrayList

3 LinkedList

4 Stack과 Queue

5 Iterator, Listlterator, Enumeration

6 Arrays

7 Comparator와 Comparable

8 HashSet

9 TreeSet

10 HashMap과 Hashtable

11 TreeMap

12 Properties

13 Collections

14 컬렉션 클래스 정리 & 요약

2. ArrayList

 기존의 Vector클래스를 개선한 것으로 Vector와 구현원리와 기능적인 측면이 동일하다. 하지만 호환성 때문에 Vector를 사용하는 것이기 때문에 가급적 ArrayList를 사용해야 한다.

 

 ArrayList는 Object배열을 이용해서 데이터를 순차적으로 저장한다. 배열에 더 이상 저장할 공간이 없으면 더 큰 배열을 생성해서 기존 배열의 내용을 새로운 배열로 복사한 다음 저장한다.

 

메서드 설명
ArrayList( ) 크기가 10인 ArrayList 생성
ArrayList(Collection c) 주어진 컬렉션이 저장된 ArrayList 생성
ArrayList(int initialCapacity) 지정된 초기용량을 갖는 ArrayList 생성
boolean add(Object o) ArrayList의 마지막에 객체를 추가. 성공하면 true
void add(int index, Object element) 지정된 위치에 객체를 저장
boolean addAll(Collection c) 주어진 컬렉션의 모든 객체를 저장
boolean addAll(int index, Collection c) 지정된 위치부터 주어진 컬렉션의 모든 객체를 저장
void clear( ) ArrayList를 완전히 비움
Object clone( ) ArrayList를 복제
boolean contains(Object o) 지정된 객체가 ArrayList에 포함되어 있는지 확인
void ensureCapacity(int minCapacity) ArrayList의 용량이 최소한 minCapacity가 되도록 함
Object get(int index) 지정된 위치에 저장된 객체를 반환
int indexOf(Object o) 지정된 객체가 저장된 위치를 찾아 반환
boolean isEmpty( ) ArrayList가 비어있는지 확인
Iterator iterator( ) ArrayList의 Iterator객체를 반환
int lastindexOf(Object o) 객체가 저장된 위치를 끝부터 역방향으로 검색해서 반환
ListIterator listIterator( ) ArrayList의 ListIterator를 반환
ListIterator listIterator(int index) ArrayList의 지정된 위치부터 시작하는 ListIterator를 반환
Object remove(int index) 지정된 위치에 있는 객체를 제거
boolean removeAll(Collection c) 지정한 컬렉션에 저장된 것과 동일한 객체들을 ArrayList에서 제거
boolean retainAll(Collection c) ArrayList에 저장된 객체중에서 주어진 컬렉션과 공통된 것들만 남기고 나머지는 삭제
Object set(int index, Object element) 주어진 객체를 지정된 위치에 저장한다.
int size( ) ArryaList에 저장된 객체의 개수를 반환
void sort(Comparator c) 지정된 정렬기준으로 ArrayList를 정렬
List subList(int fromIndex, int toIndex) fromIndex부터 toIndex사이에 저장된 객체를 반환
Object[ ] toArray( ) ArrayList에 저장된 모든 객체들을 객체배열로 반환
Object[ ] toArray(Object a) ArrayList에 저장된 모든 객체들을 객체배열 a에 담아 반환
void trimToSize( ) 용량을 크기에 맞게 줄임 (빈 공간을 없앰)

 

 ArrayList는 한 요소가 삭제될 때마다 빈공간을 채우기 위해 나머지 요소들이 자리이동을 하기 때문에 올바른 결과를 얻을 수 없으므로 제어변수를 감소시켜가면서 삭제를 해야 영향을 받지 않는다.

 

 ArrayList를 생성할 때, 자동적으로 크기가 늘어나는 과정에서 처리시간이 많이 걸리기 때문에 저장될 요소의 개수보다 여유 있는 크기로 생성하는 것이 좋다.

 

예제/VectorEx1.java

import java.util.*;

public class VectorEx1 {
    public static void main(String[] args) {
        Vector v = new Vector(5);
        v.add("1");
        v.add("2");
        v.add("3");
        print(v);

        v.trimToSize(); // 빈공간을 없앤다. 용량과 크기가 같아진다.
        System.out.println("=== After trimToSize() ===");
        print(v);

        v.ensureCapacity(6);
        System.out.println("=== After ensureCapacity(6) ===");
        print(v);

        v.setSize(7);
        System.out.println("=== After setSize(7) ===");
        print(v);

        v.clear();
        System.out.println("=== After clear() ===");
        print(v);
    }

    public static void print(Vector v) {
        System.out.println(v);
        System.out.println("size : " + v.size());
        System.out.println("capacity : " + v.capacity());
    }
}
실행결과

[1, 2, 3]
size : 3
capacity : 5
=== After trimToSize() ===
[1, 2, 3]
size : 3
capacity : 3
=== After ensureCapacity(6) ===
[1, 2, 3]
size : 3
capacity : 6
=== After setSize(7) ===
[1, 2, 3, null, null, null, null]
size : 7
capacity : 12
=== After clear() ===
[]
size : 0
capacity : 12

 

Vector의 용량과 크기에 관한 것인데 각 실행과정을 단계별로 살펴보자.

 

1 capacity가 5인 Vector인스턴스 v를 생성하고, 3개의 객체를 저장한다.

2. v.trimToSize( )를 호출하면 v의 빈공간을 없애서 size와 capacity를 같게 한다. 배열의 크기는 변경이 안되므로 새로운 배열을 생성해서 그 주소값을 변수 v에 할당한다. 기존의 Vector인스턴스는 더 이상 사용할 수 없고, 가비지 컬렉터(garbage collector)에 의해 메모리에서 제거된다.

3 v.ensureCapacity(6)은 v의 capacity가 최소한 6이 되도록 한다. v의 capacity가 3이므로 크기가 6인 배열을 생성해서 v의 내용을 복사해서 새로운 인스턴스를 생성했다.

4 v.setSize(7)는 v의 size가 7이 되도록 한다. 지금 capacity가 6이므로 새로운 인스턴스를 생성해야 한다. capacity가 부족하면 자동적으로 2배의 크기로 증가되어 생성되기 때문에 v의 capacity는 12가 된다.

5 v.clear( )는 v의 모든 요소를 삭제한다.

 

 ArrayList나 Vector같이 배열을 이용한 자료구조는 데이터를 읽어오고 저장하는 데는 효율이 좋지만, 용량을 변경해야 할 때는 상당히 효율이 떨어진다. 따라서 처음 인스턴스를 생성할 때, 여유가 있도록 인스턴스를 생성하는 것이 좋다.

 

 

 

 

 

출처 | Java의 정석 (남궁 성)

728x90