Java/배열

[Java]배열 마지막 요소 제거하는 방법

DevStory 2022. 9. 6.

배열 마지막 요소 제거하는 방법

Java에서 배열은 선언과 동시에 고정된 크기를 가지는 데이터입니다. 배열이 생성되면 배열의 크기가 고정이므로 새로운 요소를 추가하거나 제거할 수 없습니다.

 

그러나, 특정 크기를 가지는 새로운 배열을 생성 후 기존 배열에 할당하는 작업을 수행하여 배열의 마지막 요소를 제거할 수 있습니다.

 

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


방법 1. 반복문

가장 심플한 방법인 반복문을 사용하여 배열의 마지막 요소를 제거할 수 있습니다.

 

[제거 방법]

순서 1. 기존 배열의 크기의 1보다 작은 새로운 배열을 생성합니다.

순서 2. 반복문을 사용하여 새로운 배열에 값을 할당합니다.

 

다음 예제는 int 타입인 배열의 마지막 요소를 제거합니다.

public class MainForm {
  public static int[] lastElementRemove(int[] srcArray) {
    int[] newArray = new int[srcArray.length - 1];

    for(int index = 0; index < srcArray.length - 1; index++) {
      newArray[index] = srcArray[index];
    }
    return newArray;
  }

  public static void main(String args[]) {
    int[] intArray = {0, 10, 20, 30, 40};

    System.out.println("마지막 요소 제거 전: " + Arrays.toString(intArray));

    intArray = lastElementRemove(intArray);

    System.out.println("마지막 요소 제거 후: " + Arrays.toString(intArray));
  }
}

[실행 결과]

마지막 요소 제거 전: [0, 10, 20, 30, 40]
마지막 요소 제거 후: [0, 10, 20, 30]

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

두 번째 Arrays 클래스에서 제공하는 copyOf() 메서드를 사용하여 마지막 요소가 제거된 새로운 배열을 생성할 수 있습니다.

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

copyOf() 메서드는 매개변수로 전달받은 기존 배열(original)의 0번째 인덱스부터 특정 개수(newLength)만큼 복사된 요소로 구성된 새로운 배열을 반환합니다.

 

다음 예제는 int 타입인 배열의 마지막 요소를 제거합니다.

public class MainForm {
  public static int[] lastElementRemove(int[] srcArray) {
    return Arrays.copyOf(srcArray, srcArray.length - 1);
  }

  public static void main(String args[]) {
    int[] intArray = {0, 10, 20, 30, 40};

    System.out.println("마지막 요소 제거 전: " + Arrays.toString(intArray));

    intArray = lastElementRemove(intArray);

    System.out.println("마지막 요소 제거 후: " + Arrays.toString(intArray));
  }
}

[실행 결과]

마지막 요소 제거 전: [0, 10, 20, 30, 40]
마지막 요소 제거 후: [0, 10, 20, 30]

방법 3. Arrays 클래스의 copyOfRange 메서드

copyOf()에서 기능이 확장된 copyOfRange() 메서드를 사용하여 마지막 요소가 제거된 새로운 배열을 생성할 수 있습니다. copyOfRange() 메서드는 복사하고 싶은 요소의 범위를 설정할 수 있습니다.

public static <T> T[] copyOfRange(T[] original, int from, int to);

 

다음 예제는 int 타입인 배열의 마지막 요소를 제거합니다.

public class MainForm {
  public static int[] lastElementRemove(int[] srcArray) {
    return Arrays.copyOfRange(srcArray, 0, srcArray.length - 1);
  }

  public static void main(String args[]) {
    int[] intArray = {0, 10, 20, 30, 40};

    System.out.println("마지막 요소 제거 전: " + Arrays.toString(intArray));

    intArray = lastElementRemove(intArray);

    System.out.println("마지막 요소 제거 후: " + Arrays.toString(intArray));
  }
}

[실행 결과]

마지막 요소 제거 전: [0, 10, 20, 30, 40]
마지막 요소 제거 후: [0, 10, 20, 30]

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

또 다른 방법으로 System 클래스의 arraycopy() 메서드를 사용하여 배열의 마지막 요소가 제거된 새로운 배열을 생성할 수 있습니다. arraycopy() 메서드는 기존 배열의 특정 위치부터 특정 개수의 요소를 새로운 배열의 특정 위치로 복사합니다.

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이 발생합니다.

 

다음 예제는 int 타입인 배열의 마지막 요소를 제거합니다.

public class MainForm {
  public static int[] lastElementRemove(int[] srcArray) {
    int[] newArray = new int[srcArray.length - 1];
    System.arraycopy(srcArray, 0,newArray, 0, srcArray.length - 1);
    return newArray;
  }

  public static void main(String args[]) {
    int[] intArray = {0, 10, 20, 30, 40};

    System.out.println("마지막 요소 제거 전: " + Arrays.toString(intArray));

    intArray = lastElementRemove(intArray);

    System.out.println("마지막 요소 제거 후: " + Arrays.toString(intArray));
  }
}

[실행 결과]

마지막 요소 제거 전: [0, 10, 20, 30, 40]
마지막 요소 제거 후: [0, 10, 20, 30]

방법 5. List로 변환

마지막 방법으로 배열을 List로 변환 후 remove() 메서드를 호출하여 마지막 요소를 제거 후 List를 다시 배열로 변환합니다.

 

이 방법의 단점은 List는 기본 타입을 허용하지 않으므로 배열의 타입이 기본 타입인 경우 래퍼 클래스로 변경해야 합니다.

 

다음 예제는 Integer 타입인 배열의 마지막 요소를 제거합니다.

public class MainForm {
  public static Integer[] lastElementRemove(Integer[] srcArray) {
    List<Integer> newList = new ArrayList<>(Arrays.asList(srcArray));
    newList.remove(srcArray.length - 1);
    return newList.toArray(new Integer[0]);
  }

  public static void main(String args[]) {
    Integer[] intArray = {0, 10, 20, 30, 40};

    System.out.println("마지막 요소 제거 전: " + Arrays.toString(intArray));

    intArray = lastElementRemove(intArray);

    System.out.println("마지막 요소 제거 후: " + Arrays.toString(intArray));
  }
}

[실행 결과]

마지막 요소 제거 전: [0, 10, 20, 30, 40]
마지막 요소 제거 후: [0, 10, 20, 30]
반응형

댓글