Java에서 ArrayList는 가장 많이 사용되는 데이터 스트럭쳐입니다. 특히 자바의 배열은 동일한 데이터 타입의 엘리먼트만 담을 수 있고 크기가 고정 되어 있기 때문에 사용하기가 까다롭습니다.
내장된 ArrayList의 사용법
ArrayList를 직접 구현하기 전에 자바에서 기본적으로 제공하는 ArrayList의 사용법을 먼저 봅시다. 아래 예제에 대한 전체 코드는 http://ideone.com/76QWCq 에 있습니다.
생성
ArrayList를 사용하기 위해서는 우선 ArrayList 객체를 만들어야 합니다.
ArrayList<Integer> numbers = new ArrayList<>();
ArrayList는 java.util.ArrayList에 포함되어 있기 때문에 import를 해주셔야 합니다.
import java.util.ArrayList;
추가
엘리먼트를 추가 할 때는 add 메소드를 사용합니다. add는 배열에 단순히 더해지는 것이기 때문에 빠르게 동작합니다.
numbers.add(10); numbers.add(20); numbers.add(30); numbers.add(40);
특정 위치에 추가하고 싶다면 메소드 add의 첫번째 인자로 인덱스를 지정합니다.
numbers.add(1, 50);
자바의 배열은 크기가 고정되어 있습니다. 데이터를 추가하는 과정에서 내부적으로 사용하는 배열이 꽉차면 기존의 배열 대비 크기가 2배 큰 새로운 배열을 만들고 기존의 데이터를 새로운 배열로 복제합니다. 덕분에 프로그래머는 ArrayList의 크기에 신경쓰지 않고 편리하게 프로그램을 만들 수 있습니다. 하지만 배열의 크기를 키우는 과정에서 많은 부하가 발생합니다. 이런 기능은 List 데이터 스트럭쳐의 본질적인 기능이라고 할 수는 없습니다. 따라서 우리 수업에서는 다루지 않습니다. 궁금하신 분은 Dynamic Array를 참고해주세요.
삭제
특정 인덱스에 위치하는 엘리먼트를 삭제할 때는 remove를 사용합니다.
numbers.remove(2);
가져오기
엘리먼트를 가져올 때는 get을 사용합니다. 이때 내부적으로 배열을 이용하기 때문에 매우 빠르게 엘리먼트를 가져올 수 있습니다.
numbers.get(2);
반복
자바에서는 ArrayList를 탐색하기 위한 방법으로 iterator을 제공합니다. 이것은 주로 객체지향 프로그래밍에서 사용하는 반복기법입니다. 우선 Iterator 객체를 만들어야 합니다.
Iterator it<Integer> = numbers.iterator();
Iterator 객체는 numbers 객체 내부에 저장된 값을 하나씩 순회하면서 탐색할 수 있도록 돕는 객체입니다.
while(it.hasNext()){ System.out.println(it.next()); }
it.next() 메소드를 호출할 때마다 엘리먼트를 순서대로 리턴합니다. 만약 더 이상 순회할 엘리먼트가 없다면 it.hasNext()의 값은 false가 되면서 while문이 종료 됩니다.
단순 출력을 위해서 순회를 하지는 않겠지요? 순회 과정에서 필요에 따라서는 엘리먼트를 삭제/추가하는 작업을 해야 할 것입니다. 그런 경우 아래와 같이 처리할 수 있습니다.
while(it.hasNext()){ int value = it.next(); if(value == 30){ it.remove(); } }
it.remove()는 it.next()를 통해서 반환된 numbers의 엘리먼트를 삭제하는 명령입니다.
조금 더 편리한 방법도 있습니다.
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)); } } }