Data Structure (자료구조)

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

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. 김현철
    int value = it.next().intValue();
    대화보기
    • ddojai
      int value = (int) it.next();
      java 1.6 기준으로 캐스팅 문법 에러가 발생하네요. 1.7부터는 정상적으로 될것 같지만.. 1.6은 아래처럼 Integer 로 캐스팅 하시면 될듯.
      int value = (Integer)it.next();
    버전 관리
    egoing
    현재 버전
    선택 버전
    graphittie 자세히 보기