Data Structure (자료구조)

비전공자는 도전해볼 수 있고, 전공자는 쉽게 배울 수 있는 데이터 스트럭쳐 수업

ArrayList - Java API

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));
		}

	}

}

댓글

댓글 본문
  1. 코딩이취미다
    배열을 이용한다고 해서 배열 처럼 인덱스로 참조를 할 수는 없군요
    get 메소드를 이용 해서만 참조가 가능 하네요
  2. baeroro
    ㅇ헌
  3. 바울
    질문 있습니다.
    ArrayList는 배열과 다르게 크기가 가변적인건가요? 아니면 내장 api와 사용자가 구현해지는 것에 따라 달라지는건가요?

    LinkedList 같은 경우는 새로운 공간을 동적할당해서 기존의 데이터와 붙여주거나 메모리 공간을 해제해주는데,

    ArrayList는 어떻게 공간을 새로 만들어서 기존의 데이터랑 연결해주는지요?
  4. SangHyeok Kim
    2017/03/30 수강완료!
    감사합니다!!
  5. shrin
    @도와주세요님
    import한 ArrayList가 java.util.ArrayList가 맞는지 확인해보세요.
    대화보기
    • shrin
      제가 알기로 자바 1.7 이상부터는 변수 선언 부분에 제네릭 타입이 지정되어 있으면 생성 부분에는 지정을 생략 가능한 것으로 알고 있어요~
      대화보기
      • 지나가는행인
        new ArrayList<>();

        여기에 꼭 변수 타입이 들어가야합니다. => new ArrayList<Integer>();
        대화보기
        • 지나가는행인
          new ArrayList<>();

          여기에 꼭 변수 타입이 들어가야합니다. => new ArrayList<Integer>();
          대화보기
          • 도와주세요
            ArrayList<Integer> numbers = new ArrayList<>(); 이것만 했는데
            아래처럼 에러가 나옵니다.
            - The type ArrayList is not generic; it cannot be parameterized with arguments <>
            - The type ArrayList is not generic; it cannot be parameterized with arguments
            무엇이 문제인지 모르겠습니다. 1.8버전 입니다.
          • 김현철
            int value = it.next().intValue();
            대화보기
            • ddojai
              int value = (int) it.next();
              java 1.6 기준으로 캐스팅 문법 에러가 발생하네요. 1.7부터는 정상적으로 될것 같지만.. 1.6은 아래처럼 Integer 로 캐스팅 하시면 될듯.
              int value = (Integer)it.next();