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 배열은 크기가 고정되어 있으므로 인스턴스화하는 동안 크기를 제공해야 합니다. 일단 인스턴스화되면 어레이의 크기를 늘릴 수 없습니다. 대신 크기가 조정된 새 배열을 만들고 이전 배열의 모든 요소를 복사해야 합니다.
ArrayList 는 List 인터페이스의 크기 조정 가능한 배열 구현입니다. 즉, 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에서 사용할 수 있습니다 .