MyCloud

JAVA의 ArrayList 본문

Programming/Data Structure

JAVA의 ArrayList

Swalloow 2016. 2. 20. 11:32


변수에 담겨진 데이터는 하나의 데이터유형을 하나만 보관할 수 있습니다. 

하지만 배열은 하나의 데이터유형을 여러개 보관할 수 있습니다. 

각 요소들은 정수형 인덱스로 접근가능하며 다양하게 활용할 수 있습니다.


리스트는 순서를 가진 항목들의 모임입니다. 

일반적으로 리스트는 배열리스트와 연결리스트로 표현되는데 

배열리스트는 크기가 제한되므로 삽입, 삭제 시 범위를 넘어가는 문제가 생깁니다. 

반면 연결리스트는 크기가 제한되지 않아 삽입, 삭제가 효율적입니다.


+ 추가 (ArrayList와 Vector의 차이)

기능적 측면에서 보면 ArrayList와 Vector의 차이는 거의 없습니다.

하지만 Java API 문서에 따르면, ArrayList에는 다음과 같이 정의되어 있습니다.

"This implementation is not synchronized"

즉, 멀티쓰레드를 통해 사용하는 경우 Collections.synchronizedMap으로 매핑시켜 주어야 합니다.

Map m = Collections.synchronizedMap( new ArrayList( . . . ));

즉, ArrayList는 쓰레드에 의한 문제를 배제하기 때문에 Critiacl Section을 생성할 필요가 없습니다.

이를 통해 만일 쓰레드를 사용하는 경우가 아니라면,

ArrayList의 성능이 Vector 보다 훨씬 뛰어나다는 것을 알 수 있습니다.









JAVA ArrayList


Java에서 ArrayList는 가장 많이 사용되는 구조입니다. 

리스트형태의 데이터를 배열 구조로 가지고 있는 객체이며 

각 데이터의 인덱스를 통해 한번에 필요한 데이터로 접근할 수 있습니다! 

다음 코드를 통해 자세히 알아보겠습니다.



1
2
3
4
5
6
7
8
public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(10);
        numbers.add(20);
        numbers.add(30);
        numbers.add(40);
        System.out.println("add : " + numbers);
cs



ArrayList를 사용하기 위해서는 우선 ArrayList 객체를 생성해야 합니다.

요소를 추가할 때는 위와 같이 add 메소드를 사용합니다.





배열리스트 형태로 저장되기 때문에 인덱스가 0부터 시작합니다.

numbers의 요소는 위와 같이 저장됩니다.



1
2
    numbers.add(150);
    System.out.println("addIndex : " + numbers);
cs



위와 같이 원하는 위치의 인덱스에 직접 넣어줄 수 있습니다.

ArrayList는 데이터를 추가할 때마다 기존의 데이터가 한 칸씩 옆으로 이동하는

Shift가 발생하기 때문에 상세한 작업의 경우 속도가 조금 떨어질 수 있습니다.





결과는 위와 같이 1번 인덱스 위치에 50이 저장됩니다.

자바의 배열은 크기가 고정되어 있기 때문에 데이터를 추가하는 과정에서 내부적으로 사용하는 배열이 차면

기존의 데이터를 새로운 배열로 복제합니다. 

따라서 자바의 ArrayList에서는 C언어와 달리 배열의 크기에 신경쓰지 않아도 된다는 장점이 있습니다.



1
2
3
    numbers.remove(2);
    System.out.println("removeIndex : " + numbers);
    numbers.removeAll(numbers);
cs



원하는 인덱스에 위치하는 요소를 삭제할 때는 remove 함수를 사용합니다.

ArrayList 내의 모든 요소를 삭제하고 싶을 때는 removeAll 함수를 사용합니다.





결과는 위와 같이 2번 인덱스의 20이 삭제되고 이후의 데이터가 앞으로 한 칸씩 이동하게 됩니다.



1
2
3
    System.out.println("getIndex : " + numbers.get(2));
    System.out.println("getSize : " + numbers.size());
    System.out.println("indexOf : " + numbers.indexOf(30));
cs



원하는 인덱스의 요소를 꺼내고 싶을 땐 get 함수를

배열의 크기를 알고 싶을 땐 size 함수를

요소 값의 인덱스를 알고 싶을 땐 indexOf 함수를 사용합니다.



1
2
3
4
5
6
7
    for(int i = 0; i < numbers.size(); i++) {
        System.out.print(numbers.get(i)+ " ");
    }
        
    for(int value : numbers) {
        System.out.print(value+ " ");
    }
cs



ArrayList의 모든 요소를 출력하는 방법 2가지가 있습니다.

하나는 배열의 사이즈만큼 for문을 돌려서 얻는 방법,

두번째는 numbers 내의 모든 요소들을 하나씩 반환하여 출력하는 방법입니다.



1
2
3
4
5
6
7
8
    int[] value = {10203040};
    for(int i = 0; i < value.length; i++) {
        numbers.add(value[i]);
    }
    
    for(int number : numbers) {
        System.out.print(number+ " ");
    }
cs



다음은 정의된 배열의 값을 ArrayList로 저장하는 방법입니다.


* 참고자료 : https://opentutorials.org/module/1335/8857



'Programming > Data Structure' 카테고리의 다른 글

JAVA의 Stack  (0) 2016.03.11
JAVA의 LinkedList  (0) 2016.02.20
JAVA의 Collection, Map  (0) 2016.02.17
공간복잡도 / 시간복잡도  (0) 2016.02.01
선형 / 비선형 자료구조  (3) 2016.02.01
Comments