ArrayList - JAVA API

ArrayList는 Java에서 가장 많이 사용되는 데이터 스트럭쳐입니다.

내장된 ArrayList의 사용법

ArrayList를 직접 구현하기 전에 자바에서 기본적으로 제공하는 ArrayList의 사용법을 먼저 봅시다. 아래 예제에 대한 전체 코드는 http://ideone.com/76QWCq 에 있습니다.

생성

ArrayList를 사용하려면 먼저 ArrayList 객체를 만들어야 합니다.

ArrayList<Integer> numbers = new ArrayList<>();

ArrayList는 java.util.ArrayList에 포함되어 있으므로 먼저 java.util.ArrayList import를 합니다.

import java.util.ArrayList;

추가

엘리먼트를 추가할 때는 add 메소드를 사용합니다. add는 단순히 배열 뒤에 데이터를 더하기 때문에 빠릅니다.

numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);

img

numbers.add(1, 50);

img

자바 배열의 크기는 고정되어 있습니다. 내부의 배열이 꽉 찼는데 새로운 데이터를 추가하려면 어떻게 할까요? 이때는 기존 배열보다 2배 긴 새 배열을 만들어, 기존 데이터를 새로운 배열로 복제합니다. 덕분에 프로그래머는 ArrayList의 크기를 신경 쓰지 않아도 됩니다. 하지만 배열의 크기를 키우는 데는 많은 부하가 걸립니다. 이런 기능은 List 데이터 스트럭쳐의 본질적인 기능은 아닙니다. 따라서 우리 수업에서는 다루지 않습니다. 궁금하신 분은 Dynamic Array를 참고해주세요.

삭제

특정 인덱스에 위치한 엘리먼트를 삭제할 때는 remove를 사용합니다.

numbers.remove(2);

img

가져오기

특정 인덱스에 위치한 엘리먼트를 가져올 때는 get을 사용합니다. 이때 내부에서 배열을 사용하기 때문에 ArrayList는 매우 빠르게 엘리먼트를 가져옵니다.

numbers.get(2);

img

반복

ArrayList를 탐색할 때는 Iterator를 씁니다. Iterator는 객체지향 프로그래밍에서 주로 사용하는 반복 기법입니다. Iterator를 쓰려면 우선 Iterator 객체를 만들어야 합니다.

Iterator it<Integer> = numbers.iterator();

Iterator 객체를 쓰면 numbers 객체에 저장된 값을 하나씩 순회할 수 있습니다.

while(it.hasNext()){
    System.out.println(it.next());          
}

it.next() 메소드는 호출될 때마다 엘리먼트를 순서대로 리턴합니다. 만약 더 이상 순회할 엘리먼트가 없다면 it.hasNext() 는 false를 리턴해 while문은 종료됩니다. Iterator는 엘리먼트를 삭제/추가할 때도 쓸 수 있습니다.

while(it.hasNext()){
    int value = it.next();
    if(value == 30){
        it.remove();
    }                       
}

it.remove()는 it.next()를 통해서 반환된 numbers의 엘리먼트를 삭제합니다. Iterator보다 조금 더 편리하게 엘리먼트를 순회하는 방법도 있습니다.

for(int value : numbers){
    System.out.println(value);
}

전체코드

package list.arraylist.api;

import java.util.ArrayList;
import java.util.Iterator;

public class Main {

    public static void main(String[] args) {

        ArrayList<Integer> numbers = new ArrayList<>();

        numbers.add(10);
        numbers.add(20);
        numbers.add(30);
        numbers.add(40);
        System.out.println("add(값)");
        System.out.println(numbers);

        numbers.add(1, 50);
        System.out.println("\nadd(인덱스, 값)");
        System.out.println(numbers);

        numbers.remove(2);
        System.out.println("\nremove(인덱스)");
        System.out.println(numbers);

        System.out.println("\nget(인덱스)");
        System.out.println(numbers.get(2));

        System.out.println("\nsize()");
        System.out.println(numbers.size());

        System.out.println("\nindexOf()");
        System.out.println(numbers.indexOf(30));

        Iterator it = numbers.iterator();
        System.out.println("\niterator");
        while (it.hasNext()) {
            int value = (int) it.next();
            if (value == 30) {
                it.remove();
            }
            System.out.println(value);
        }
        System.out.println(numbers);

        System.out.println("\nfor each");
        for (int value : numbers) {
            System.out.println(value);
        }
        System.out.println("\nfor");
        for (int i = 0; i < numbers.size(); i++) {
            System.out.println(numbers.get(i));
        }

    }

}