[Java] 배열 크기 변경, 3가지 방법
June 10, 2024
배열의 크기(길이)를 동적으로 늘리는 방법에 대해서 알아보겠습니다.
사실 Java에서 배열의 크기를 늘리는 것은 기본적으로 불가능합니다. 배열의 크기는 생성 시 고정되기 때문입니다. 이런 이유로, 배열 크기를 변경하려면 새로운 배열을 생성하고, 기존 배열의 데이터를 복사해야 합니다.
1. Arrays.copyOf()를 이용한 방법
Arrays.copyOf(array, newSize)
는 newSize 크기의 배열을 생성하고, array의 요소들을 새로운 배열에 복사합니다.
- 원본 배열의 크기보다 새로운 배열의 크기가 크면, 빈 공간은 0 또는 null로 채워집니다.
- 원본 배열의 크기보다 새로운 배열의 크기가 작으면, 새로운 배열의 길이만큼만 복사합니다.
아래와 같이 기본 배열보다 크기가 증가한, 또는 감소한 새로운 배열을 만들 수 있습니다.
import java.util.Arrays;
public class Example {
public static void main(String[] args) {
int[] originalArray = {1, 2, 3, 4, 5};
int newSize = originalArray.length + 3; // 새로운 크기 지정
// 크기가 3 증가한, 새로운 배열 생성
int[] newArray = Arrays.copyOf(originalArray, newSize);
System.out.println("Original Array: " + Arrays.toString(originalArray));
System.out.println("Resized Array: " + Arrays.toString(newArray));
// 크기가 2 감소한, 새로운 배열 생성
newSize = originalArray.length -2;
newArray = Arrays.copyOf(originalArray, newSize);
System.out.println("Original Array: " + Arrays.toString(originalArray));
System.out.println("Resized Array: " + Arrays.toString(newArray));
}
}
Output:
Original Array: [1, 2, 3, 4, 5]
Resized Array: [1, 2, 3, 4, 5, 0, 0, 0]
Original Array: [1, 2, 3, 4, 5]
Resized Array: [1, 2, 3]
2. List를 이용한 방법
List는 동적으로 크기 증가, 감소가 가능한 자료구조입니다. 배열을 리스트로 변경 후, 크기를 조절하고 다시 배열로 변경하는 방법이 있습니다.
Arrays.stream(originalArray).boxed().collect(Collectors.toList())
: int[]를 List로 변환 list.stream().mapToInt(i -> i).toArray()
: List를 int[]로 변환 list.add(6)
: 리스트에 값 6 추가list.remove(list.size() - 1)
: 리스트의 마지막 index(size-1) 값 제거
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Example {
public static void main(String[] args) {
int[] originalArray = {1, 2, 3, 4, 5};
// 크기가 3 증가한, 새로운 배열 생성
List<Integer> list = Arrays.stream(originalArray).boxed().collect(Collectors.toList());
list.add(6);
list.add(7);
list.add(8);
int[] newArray = list.stream().mapToInt(i -> i).toArray();
System.out.println("Original Array: " + Arrays.toString(originalArray));
System.out.println("Resized Array: " + Arrays.toString(newArray));
// 크기가 2 감소한, 새로운 배열 생성
list = Arrays.stream(originalArray).boxed().collect(Collectors.toList());
list.remove(list.size() - 1);
list.remove(list.size() - 1);
newArray = list.stream().mapToInt(i -> i).toArray();
System.out.println("Original Array: " + Arrays.toString(originalArray));
System.out.println("Resized Array: " + Arrays.toString(newArray));
}
}
Output:
Original Array: [1, 2, 3, 4, 5]
Resized Array: [1, 2, 3, 4, 5, 6, 7, 8]
Original Array: [1, 2, 3, 4, 5]
Resized Array: [1, 2, 3]
3. for문을 이용한 방법
아래와 같이 새로운 크기의 배열을 생성하고, 원본 배열의 값을 복사해줄 수도 있습니다.
if (i >= originalArray.length) break
: 크기 증가로, 원본 배열에서 복사할 것이 없을 때 break로 for문 종료
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Example {
public static void main(String[] args) {
int[] originalArray = {1, 2, 3, 4, 5};
// 크기가 3 증가한, 새로운 배열 생성
int[] newArray = new int[originalArray.length + 3];
for (int i = 0; i < newArray.length; i++) {
if (i >= originalArray.length) {
break;
}
newArray[i] = originalArray[i];
}
System.out.println("Original Array: " + Arrays.toString(originalArray));
System.out.println("Resized Array: " + Arrays.toString(newArray));
// 크기가 2 감소한, 새로운 배열 생성
newArray = new int[originalArray.length - 2];
for (int i = 0; i < newArray.length; i++) {
newArray[i] = originalArray[i];
}
System.out.println("Original Array: " + Arrays.toString(originalArray));
System.out.println("Resized Array: " + Arrays.toString(newArray));
}
}
Output:
Original Array: [1, 2, 3, 4, 5]
Resized Array: [1, 2, 3, 4, 5, 0, 0, 0]
Original Array: [1, 2, 3, 4, 5]
Resized Array: [1, 2, 3]