1. 개요

이 사용방법(예제)에서는 Java 배열과 표준 ArrayList 간의 메모리 할당의 유사점과 차이점을 간략하게 살펴보겠습니다 . 또한 배열 및 ArrayList 에 요소를 추가하고 삽입하는 방법을 살펴보겠습니다 .

2. 자바 배열과 ArrayList

Java 배열 은 언어에서 제공하는 기본 데이터 구조입니다 . 반대로 ArrayList 는 배열로 지원되는 List 인터페이스 의 구현이며 Java Collections Framework에서 제공됩니다.

2.1. 요소 액세스 및 수정

대괄호 표기법을 사용하여 배열 요소에 액세스하고 수정할 수 있습니다.

System.out.println(anArray[1]);
anArray[1] = 4;

반면에 ArrayList 에는 요소에 액세스하고 수정하는 일련의 메서드가 있습니다.

int n = anArrayList.get(1);
anArrayList.set(1, 4);

2.2. 고정 VS 동적 크기

배열과 ArrayList 모두 유사한 방식으로 힙 메모리를 할당하지만 차이점은 배열의 크기가 고정된 반면 ArrayList 의 크기는  동적으로 증가한다는 것입니다.

Java 배열은 크기가 고정되어 있으므로 인스턴스화하는 동안 크기를 제공해야 합니다. 일단 인스턴스화되면 어레이의 크기를 늘릴 수 없습니다. 대신 크기가 조정된 새 배열을 만들고 이전 배열의 모든 요소를 ​​복사해야 합니다.

ArrayListList 인터페이스의 크기 조정 가능한 배열 구현입니다. 즉, ArrayList 는 요소가 추가됨에 따라 동적으로 증가합니다. 현재 요소( ArrayList 에 추가할 새 요소 포함 )의 수가 기본 배열의 최대 크기보다 크면 ArrayList는 기본 배열 크기를 늘립니다.

기본 배열의 성장 전략은 ArrayList 구현에 따라 다릅니다 . 그러나 기본 배열의 크기를 동적으로 늘릴 수 없기 때문에 새 배열이 생성되고 이전 배열 요소가 새 배열에 복사됩니다.

추가 작업에는 일정한 상각 시간 비용이 있습니다. 즉, ArrayList 에 n개의 요소를 추가 하려면 O(n) 시간이 필요합니다.

2.3. 요소 유형

배열은 배열의 정의에 따라 기본 데이터 유형과 비기본 데이터 유형을 포함할 수 있습니다. 그러나 ArrayList 는 기본이 아닌 데이터 유형만 포함할 수 있습니다 .

기본 데이터 유형이 있는 요소를 ArrayList 에 삽입하면 Java 컴파일러는 자동으로 기본 데이터 유형을 해당 객체 래퍼 클래스로 변환합니다.

이제 Java 배열과 ArrayList 에 요소를 추가하고 삽입하는 방법을 살펴보겠습니다 .

3. 요소 추가

이미 본 것처럼 배열은 고정된 크기입니다.

따라서 요소를 추가하려면 먼저 이전 배열보다 큰 새 배열을 선언하고 이전 배열의 요소를 새로 생성된 배열로 복사해야 합니다. 그런 다음 새로 생성된 이 배열에 새 요소를 추가할 수 있습니다.

유틸리티 클래스를 사용하지 않고 Java로 구현하는 방법을 살펴보겠습니다.

public Integer[] addElementUsingPureJava(Integer[] srcArray, int elementToAdd) {
    Integer[] destArray = new Integer[srcArray.length+1];

    for(int i = 0; i < srcArray.length; i++) {
        destArray[i] = srcArray[i];
    }

    destArray[destArray.length - 1] = elementToAdd;
    return destArray;
}

또는 Arrays 클래스는 더 큰 크기의 새 배열을 만들고 이전 배열에서 모든 요소를 ​​복사하는 데 도움이 되는 유틸리티 메서드 copyOf() 를 제공합니다.

int[] destArray = Arrays.copyOf(srcArray, srcArray.length + 1);

새 배열을 만든 후에는 새 요소를 배열에 쉽게 추가할 수 있습니다.

destArray[destArray.length - 1] = elementToAdd;

반면 에 ArrayList 에 요소를 추가하는 것은 매우 쉽습니다 .

anArrayList.add(newElement);

4. 인덱스에 요소 삽입

이전에 추가한 요소를 잃지 않고 지정된 인덱스에 요소를 삽입하는 것은 배열에서 간단한 작업이 아닙니다.

우선, 배열에 크기와 동일한 수의 요소가 이미 포함되어 있으면 먼저 더 큰 크기의 새 배열을 만들고 요소를 새 배열로 복사해야 합니다.

또한 지정된 인덱스 뒤에 오는 모든 요소를 ​​오른쪽으로 한 위치 이동해야 합니다.

public static int[] insertAnElementAtAGivenIndex(final int[] srcArray, int index, int newElement) {
    int[] destArray = new int[srcArray.length+1];
    int j = 0;
    for(int i = 0; i < destArray.length-1; i++) {

        if(i == index) {
            destArray[i] = newElement;
        } else {
            destArray[i] = srcArray[j];
            j++;
        }
    }
    return destArray;
}

그러나 ArrayUtils 클래스는 항목을 배열에 삽입하는 더 간단한 솔루션을 제공합니다 .

int[] destArray = ArrayUtils.insert(2, srcArray, 77);

값을 삽입할 인덱스, 소스 배열 및 삽입할 값을 지정해야 합니다.

insert() 메서드 는 지정된 인덱스에 새 요소가 있고 나머지 모든 요소가 오른쪽으로 한 위치 이동된 더 많은 수의 요소를 포함하는 새 배열을 반환합니다.

insert() 메서드 의 마지막 인수는 가변 인수이므로 항목 수에 관계없이 배열에 삽입할 수 있습니다.

인덱스 2에서 시작하여 srcArray 에 세 개의 요소를 삽입하는 데 사용하겠습니다 .

int[] destArray = ArrayUtils.insert(2, srcArray, 77, 88, 99);

나머지 요소는 오른쪽으로 세 칸 이동합니다.

또한 이것은 ArrayList 에 대해 사소하게 달성할 수 있습니다 .

anArrayList.add(index, newElement);

ArrayList 는 요소를 이동하고 필요한 위치에 요소를 삽입합니다.

5. 결론

이 기사에서는 Java 배열과 ArrayList 에 대해 살펴보았습니다 . 또한, 우리는 둘 사이의 유사점과 차이점을 살펴보았습니다. 마지막으로 배열과 ArrayList 에 요소를 추가하고 삽입하는 방법을 살펴보았습니다 .

항상 그렇듯이 작업 예제의 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .

Generic footer banner