배열의 크기(길이)를 동적으로 늘리는 방법에 대해서 알아보겠습니다.

사실 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]