[자바/JAVA] 일반 배열보다 편리한 ArrayList

Collection Framework를 구성하는 인터페이스 중 자주 활용되는 ArrayList에 대해 정리한다.

배열과 비슷한 기능 수행

ArrayList는 이름에서도 알 수 있듯 배열(Array)의 기능을 수행한다. 그러면서도 일반적인 배열[]을 사용했을 때 동반되는 불편함인 배열의 크기 문제를 제거한다.

 

예를 들어

public static void main(String[] args) {
    int[] arr = new int[2];
    arr[0] = 0;
    arr[1] = 1;
    arr[2] = 2;
    arr[3] = 3;

    for(int i = 0; i < arr.size(); i ++) {
        System.out.println(i);
    }

배열의 크기가 2인 arr에 3번째 인덱스 값을 넣으면 ArrayIndexOutOfBoundsException라는 runtime에러가 발생한다.

 

반면 같은 내용을 ArrayList로 구현하면 에러가 발생하지 않는다. 배열의 크기를 자동으로 늘려주기 때문이다.

public static void main(String[] args) {
    ArrayList arr = new ArrayList(); // 배열의 크기를 지정해 주지 않아도 됨
    arr.add(0);
    arr.add(1);
    arr.add(2);
    arr.add(3);

    for(int i = 0; i < arr.size(); i ++) {
        System.out.println(i);
    }

ArrayList에서 값을 추가할 땐 add()를사용한다.

형변환 필요

그러나 ArrayList는 이론적으로는 형변환을 해줘야하는 단점이 존재한다.

for(int i = 0; i < arr.size(); i ++) {
    int value = arr.get(i); // error 발생
    System.out.println(i);
}

get()은 배열에 있는 값을 가져오는 메서드다. 이처럼 int 형 변수 value에 배열 값을 가져오면 에러가 발생한다. arr.get(i)가 int형 타입이 아니기 때문이다. 애당초 배열 선언부터 데이터 타입을 결정하지 않아도 되는 ArrayList는 모든 데이터 타입의 조상인 Object형 타입을 인자로 받고 있다.

때문에

int value = (int) arr.get(i);

처럼 명시를 통해 형변환을 해야한다.

Generic과 함께 사용

수동으로 형변환을 하는 수고로움을 덜기 위해 실제로는 Generic과 함께 사용된다. <>안에 데이터 타입을 명시한다.

class ArrayListEx1 {
    public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>(); 

    list.add("A");
    list.add("B");

    System.out.println(list.get(0)); // A
    System.out.println(list.get(1)); // B
    }
}

ArrayList에 사용되는 함수를 좀더 보자면

list.set(0, "AA"); // 0번 인덱스의 값을 "AA"로 교체
System.out.println(list.get(0)); // AA

set()은 특정 인덱스의 값을 바꾼다.

list.remove(0);
System.out.println(list.get(0)); // B

remove()는 특정 인덱스의 값을 삭제한다. 0번째 인덱스에 있던 AA를 삭제하고 0번째 인덱스를 출력한 결과가 B인 걸 보면 알 수 있듯 인덱스가 삭제되면 자동으로 데이터가 앞으로 당겨진다.

반응형

댓글

Designed by JB FACTORY