Java/배열

[Java]배열의 크기를 변경하는 방법

DevStory 2022. 9. 5.

배열의 크기를 변경하는 방법

Java에서 배열은 고정 크기의 데이터입니다. 배열은 선언과 동시에 고정된 크기를 가지므로 배열의 크기를 직접적으로 변경하는 것은 불가능하며, Java에서도 배열의 크기를 변경하는 기능을 제공하지 않습니다.

 

그러나, 특정 크기를 가지는 새로운 배열을 생성 후 기존 배열에 할당하는 작업을 수행하여 배열의 크기가 변경된 것처럼 동작하도록 소스 코드를 구현할 수 있습니다.

 

이번 포스팅은 Java에서 제공하는 다양한 클래스를 사용하여 배열의 크기를 변경할 수 있는 몇 가지 방법을 소개합니다.


방법 1. Arrays 클래스의 copyOf 메서드

첫 번째 방법으로 Arrays 클래스에서 제공하는 copyOf() 메서드를 사용하여 기존 배열에서 특정 크기(데이터의 개수)로 설정되는 새로운 배열을 생성 후 기존 배열에 할당합니다.

public static <T> T[] copyOf(T[] original, int newLength);

T[] original

- 기존 배열을 첫 번째 매개변수에 전달합니다.

 

int newLength

- 새로운 배열의 크기를 두 번째 매개변수에 전달합니다.

- newLength가 기존 배열의 크기보다 큰 경우 추가된 공간은 데이터 타입에 따라 0, false, null로 할당됩니다.


예제 1. 배열의 크기를 확장

다음 예제는 기본 타입인 int, boolean 배열을 copyOf() 메서드를 사용하여 배열의 크기를 확장합니다.

public class MainForm {
  public static int[] setSizeIntArray(int[] srcArray, int size) {
    int[] newArray = Arrays.copyOf(srcArray, size);
    return newArray;
  }

  public static boolean[] setSizeBooleanArray(boolean[] srcArray, int size) {
    boolean[] newArray = Arrays.copyOf(srcArray, size);
    return newArray;
  }

  public static void main(String args[]) {
    int[] intArray = {0, 10, 20, 30};
    System.out.println("int 타입의 배열의 크기 변경 전: " + Arrays.toString(intArray));

    intArray = setSizeIntArray(intArray, 6);
    System.out.println("int 타입의 배열의 크기 6으로 변경 후: " + Arrays.toString(intArray));

    boolean[] booleanArray = {true, true, false, false};
    System.out.println("\nboolean 타입의 배열의 크기 변경 전: " + Arrays.toString(booleanArray));

    booleanArray = setSizeBooleanArray(booleanArray, 6);
    System.out.println("boolean 타입의 배열의 크기 6으로 변경 후: " + Arrays.toString(booleanArray));
  }
}

[실행 결과]

int 타입의 배열의 크기 변경 전: [0, 10, 20, 30]
int 타입의 배열의 크기 6으로 변경 후: [0, 10, 20, 30, 0, 0]

boolean 타입의 배열의 크기 변경 전: [true, true, false, false]
boolean 타입의 배열의 크기 6으로 변경 후: [true, true, false, false, false, false]

copyOf() 메서드를 사용하여 배열의 크기를 확장하는 경우 int 타입은 추가된 공간을 0으로 할당하며, boolean 타입은 false를 할당합니다.

 

String 또는 사용자가 정의한 클래스처럼 참조 타입인 경우 추가된 공간을 null로 할당합니다.

public class MainForm {
  public static String[] setSizeStringArray(String[] srcArray, int size) {
    String[] newArray = Arrays.copyOf(srcArray, size);
    return newArray;
  }

  public static void main(String args[]) {
    String[] stringArray = {"One", "Two", "Three"};
    System.out.println("String 타입의 배열의 크기 변경 전: " + Arrays.toString(stringArray));

    stringArray = setSizeStringArray(stringArray, 6);
    System.out.println("String 타입의 배열의 크기 6으로 변경 후: " + Arrays.toString(stringArray));
  }
}

[실행 결과]

String 타입의 배열의 크기 변경 전: [One, Two, Three]
String 타입의 배열의 크기 6으로 변경 후: [One, Two, Three, null, null, null]

예제 2. 배열의 크기를 감소

다음 예제는 기본 타입인 int, boolean 배열을 copyOf() 메서드를 사용하여 배열의 크기를 감소시킵니다.

public class MainForm {
  public static int[] setSizeIntArray(int[] srcArray, int size) {
    int[] newArray = Arrays.copyOf(srcArray, size);
    return newArray;
  }

  public static boolean[] setSizeBooleanArray(boolean[] srcArray, int size) {
    boolean[] newArray = Arrays.copyOf(srcArray, size);
    return newArray;
  }

  public static void main(String args[]) {
    int[] intArray = {0, 10, 20, 30};
    System.out.println("int 타입의 배열의 크기 변경 전: " + Arrays.toString(intArray));

    intArray = setSizeIntArray(intArray, 2);
    System.out.println("int 타입의 배열의 크기 2로 변경 후: " + Arrays.toString(intArray));

    boolean[] booleanArray = {true, true, false, false};
    System.out.println("\nboolean 타입의 배열의 크기 변경 전: " + Arrays.toString(booleanArray));

    booleanArray = setSizeBooleanArray(booleanArray, 2);
    System.out.println("boolean 타입의 배열의 크기 2로 변경 후: " + Arrays.toString(booleanArray));
  }
}

[실행 결과]

int 타입의 배열의 크기 변경 전: [0, 10, 20, 30]
int 타입의 배열의 크기 2로 변경 후: [0, 10]

boolean 타입의 배열의 크기 변경 전: [true, true, false, false]
boolean 타입의 배열의 크기 2로 변경 후: [true, true]

방법 2. System 클래스의 arraycopy메서드

두 번째 방법으로 Arrays 클래스에서 제공하는 copyOf() 메서드와 비슷한 System 클래스에서 제공하는 arraycopy() 메서드를 사용할 수 있습니다.

 

arraycopy() 메서드는 5개의 매개변수를 가지며, 원본 배열을 새로운 배열에 특정 위치부터 특정 개수만큼의 요소를 할당합니다.

public static native void arraycopy(
  Object src,  int srcPos,
  Object dest, int destPos,
  int length);

Object src

- 복사하고자 하는 소스로 원본 배열입니다.

 

int srcPos

- 복사하고자 하는 소스(Object src)에서 데이터를 읽을 시작 위치입니다.

 

Object dest

- 원본 배열에서 복사한 데이터가 할당되는 배열입니다.

- 즉, 새로운 배열입니다.

 

int destPos

- 새로운 배열(Object dest)의 시작 위치입니다.

- 0으로 설정하는 경우 원본 배열에서 복사한 데이터가 새로운 배열의 인덱스 0부터 할당됩니다.

- 3으로 설정하는 경우 원본 배열에서 복사한 데이터가 새로운 배열의 인덱스 3부터 할당됩니다.

 

int length

- 원본 배열에서 복사되는 데이터 개수입니다.

- 원본 배열의 길이보다 큰 값이 전달되는 경우 ArrayIndexOutOfBoundsException이 발생합니다.


예제 1. 배열의 크기를 확장

다음 예제는 int, boolean, String 타입의 배열을 arraycopy() 메서드를 사용하여 배열의 크기를 확장합니다.

 

arraycopy() 메서드의 5번째 매개변수에 원본 배열의 길이보다 큰 값이 전달되면, ArrayIndexOutOfBoundsException이 발생하므로 새로운 크기가 원본 배열의 길이보다 큰 경우 원본 배열의 크기를 전달하고 그렇지 않으면 새로운 크기를 전달합니다.

public class MainForm {
  public static int[] setSizeIntArray(int[] srcArray, int size) {
    int[] newArray = new int[size];
    int length = size > srcArray.length ? srcArray.length : size;
    System.arraycopy(srcArray, 0, newArray, 0, length);
    return newArray;
  }

  public static boolean[] setSizeBooleanArray(boolean[] srcArray, int size) {
    boolean[] newArray = new boolean[size];
    int length = size > srcArray.length ? srcArray.length : size;
    System.arraycopy(srcArray, 0, newArray, 0, length);
    return newArray;
  }

  public static String[] setSizeStringArray(String[] srcArray, int size) {
    String[] newArray = new String[size];
    int length = size > srcArray.length ? srcArray.length : size;
    System.arraycopy(srcArray, 0, newArray, 0, length);
    return newArray;
  }

  public static void main(String args[]) {
    int[] intArray = {0, 10, 20, 30};
    System.out.println("int 타입의 배열의 크기 변경 전: " + Arrays.toString(intArray));

    intArray = setSizeIntArray(intArray, 6);
    System.out.println("int 타입의 배열의 크기 6으로 변경 후: " + Arrays.toString(intArray));

    boolean[] booleanArray = {true, true, false, false};
    System.out.println("\nboolean 타입의 배열의 크기 변경 전: " + Arrays.toString(booleanArray));

    booleanArray = setSizeBooleanArray(booleanArray, 6);
    System.out.println("boolean 타입의 배열의 크기 6으로 변경 후: " + Arrays.toString(booleanArray));

    String[] stringArray = {"One", "Two", "Three"};
    System.out.println("\nString 타입의 배열의 크기 변경 전: " + Arrays.toString(stringArray));

    stringArray = setSizeStringArray(stringArray, 6);
    System.out.println("String 타입의 배열의 크기 6으로 변경 후: " + Arrays.toString(stringArray));
  }
}

[실행 결과]

int 타입의 배열의 크기 변경 전: [0, 10, 20, 30]
int 타입의 배열의 크기 6으로 변경 후: [0, 10, 20, 30, 0, 0]

boolean 타입의 배열의 크기 변경 전: [true, true, false, false]
boolean 타입의 배열의 크기 6으로 변경 후: [true, true, false, false, false, false]

String 타입의 배열의 크기 변경 전: [One, Two, Three]
String 타입의 배열의 크기 6으로 변경 후: [One, Two, Three, null, null, null]

copyOf() 메서드와 마찬가지로 int 타입은 추가된 공간을 0, boolean 타입은 추가된 공간을 false, String 타입은 추가된 공간을 null로 할당합니다.


예제 2. 배열의 크기를 감소

다음 예제는 int, boolean, String 타입의 배열을 arraycopy() 메서드를 사용하여 배열의 크기를 감소시킵니다.

public class MainForm {
  public static int[] setSizeIntArray(int[] srcArray, int size) {
    int[] newArray = new int[size];
    int length = size > srcArray.length ? srcArray.length : size;
    System.arraycopy(srcArray, 0, newArray, 0, length);
    return newArray;
  }

  public static boolean[] setSizeBooleanArray(boolean[] srcArray, int size) {
    boolean[] newArray = new boolean[size];
    int length = size > srcArray.length ? srcArray.length : size;
    System.arraycopy(srcArray, 0, newArray, 0, length);
    return newArray;
  }

  public static String[] setSizeStringArray(String[] srcArray, int size) {
    String[] newArray = new String[size];
    int length = size > srcArray.length ? srcArray.length : size;
    System.arraycopy(srcArray, 0, newArray, 0, length);
    return newArray;
  }

  public static void main(String args[]) {
    int[] intArray = {0, 10, 20, 30};
    System.out.println("int 타입의 배열의 크기 변경 전: " + Arrays.toString(intArray));

    intArray = setSizeIntArray(intArray, 2);
    System.out.println("int 타입의 배열의 크기 2로 변경 후: " + Arrays.toString(intArray));

    boolean[] booleanArray = {true, true, false, false};
    System.out.println("\nboolean 타입의 배열의 크기 변경 전: " + Arrays.toString(booleanArray));

    booleanArray = setSizeBooleanArray(booleanArray, 2);
    System.out.println("boolean 타입의 배열의 크기 2로 변경 후: " + Arrays.toString(booleanArray));

    String[] stringArray = {"One", "Two", "Three"};
    System.out.println("\nString 타입의 배열의 크기 변경 전: " + Arrays.toString(stringArray));

    stringArray = setSizeStringArray(stringArray, 2);
    System.out.println("String 타입의 배열의 크기 2로 변경 후: " + Arrays.toString(stringArray));
  }
}

[실행 결과]

int 타입의 배열의 크기 변경 전: [0, 10, 20, 30]
int 타입의 배열의 크기 2로 변경 후: [0, 10]

boolean 타입의 배열의 크기 변경 전: [true, true, false, false]
boolean 타입의 배열의 크기 2로 변경 후: [true, true]

String 타입의 배열의 크기 변경 전: [One, Two, Three]
String 타입의 배열의 크기 2로 변경 후: [One, Two]
반응형

댓글