Java에서 배열 딥 복사

Rupam Yadav 2023년10월12일
  1. Java에서System.arraycopy()함수를 사용한 전체 복사
  2. Java에서Arrays.copyOf명령을 사용하여 배열 전체 복사
Java에서 배열 딥 복사

이 자습서에서는 Java에서 배열을 딥 복사하는 방법에 대해 설명합니다.

일반적으로 Java에는 Shallow Copy와 Deep Copy라는 두 가지 유형의 배열 복사 방법이 있습니다. Shallow copy에서는 개체가 복사됩니다. 반면에 모든 항목은 복사되고 다른 배열은 Deep Copy에서 생성됩니다.

다음은 배열을 다른 배열에 직접 복사 할 때 어떤 일이 발생하는지 보여주는 예입니다. 항목으로arr1배열을 생성 한 다음arr1로 다른arr2를 초기화합니다. arr2의 요소가 변경되면 변경 사항도arr1에 반영됩니다.

import java.util.Arrays;

public class DeepCopy {
  public static void main(String[] args) {
    int[] arr1 = {10, 20, 30};
    System.out.println("arr1 Before copying: " + Arrays.toString(arr1));

    int[] arr2 = arr1;
    System.out.println("arr2 After copying: " + Arrays.toString(arr1));

    arr2[0] = 30;
    System.out.println(
        "arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
  }
}

출력:

arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [30, 20, 30]

Java에서System.arraycopy()함수를 사용한 전체 복사

다음 예에서는 몇 개의 항목이있는 배열arr1을 가져 와서 다른 배열arr2를 가져 와서arr1과 같은 크기를 지정합니다. 배열을 다른 배열로 복사하는System클래스의arrayCopy()메소드를 호출합니다.

arrayCopy()함수는 4 개의 인수를 사용합니다. 처음 두 개는 소스 배열과 소스 배열에서 복사 시작 위치입니다. 세 번째 인수는 요소를 복사 할 대상 배열과 시작 위치, 새 배열에 복사 할 항목 수입니다.

이전 예에서와 같이arr2항목을 변경할 때arr1의 요소는 전혀 변경되지 않습니다.

import java.util.Arrays;

public class DeepCopy {
  public static void main(String[] args) {
    int[] arr1 = {10, 20, 30};
    System.out.println("arr1 Before copying: " + Arrays.toString(arr1));

    int[] arr2 = new int[arr1.length];

    System.arraycopy(arr1, 0, arr2, 0, arr1.length);
    System.out.println("arr2 After copying: " + Arrays.toString(arr1));

    arr2[0] = 30;
    System.out.println(
        "arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
  }
}

출력:

arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [10, 20, 30]

Java에서Arrays.copyOf명령을 사용하여 배열 전체 복사

아래에서는Arrays유틸리티 클래스의copyOf()메소드를 사용합니다. 복사 할 배열을 받아들이고 그 크기는 동일한 유형의 배열을 반환합니다. 이 방법을 사용하여 새 배열arr2를 만들고arr2변경이arr1변경 여부를 확인합니다. 출력에 결과가 표시됩니다.

이 메서드와 이전 메서드는 배열에 기본 형식 대신 개체가 포함되어있을 때 깊은 복사본 대신 얕은 복사본을 만듭니다.

import java.util.Arrays;

public class DeepCopy {
  public static void main(String[] args) {
    int[] arr1 = {10, 20, 30};
    System.out.println("arr1 Before copying: " + Arrays.toString(arr1));

    int[] arr2 = Arrays.copyOf(arr1, arr1.length);
    System.out.println("arr2 After copying: " + Arrays.toString(arr1));

    arr2[0] = 30;
    System.out.println(
        "arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
  }
}

출력:

arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [30, 20, 30]

Arrays.copyOf()를 사용하여 2 차원 배열을 복사 할 수도 있습니다. 아래 예에는 2D 배열arr가 있습니다. 새로운 배열arr2가 있고 루프에서arr의 모든 요소를 ​​가져 와서 항목별로arr2항목으로 복사하는Arrays.copyOf를 사용합니다. 복사 한 후에는arr2가 변경되면arr1이 변경되는지 확인합니다. 변경되지 않으면 딥 복사 된 배열입니다.

import java.util.Arrays;

public class DeepCopy {
  public static void main(String[] args) {
    int[][] arr = {{1, 2}, {3, 4}, {5, 6}};

    System.out.println("Values of arr");
    for (int i = 0; i < arr.length; i++)
      for (int j = 0; j < arr.length - 1; j++)
        System.out.println("arr[" + i + "][" + j + "] = " + arr[i][j]);

    System.out.println();

    int[][] arr2 = new int[arr.length][];
    for (int i = 0; i < arr.length; i++) {
      arr2[i] = Arrays.copyOf(arr[i], arr[i].length);
    }

    System.out.println("Values of arr2");

    for (int i = 0; i < arr2.length; i++)
      for (int j = 0; j < arr2.length - 1; j++)
        System.out.println("arr2[" + i + "][" + j + "] = " + arr2[i][j]);

    arr2[0][1] = 5;

    System.out.println();

    System.out.println("Values of arr after changing an element in arr2");
    for (int i = 0; i < arr.length; i++)
      for (int j = 0; j < arr.length - 1; j++)
        System.out.println("arr[" + i + "][" + j + "] = " + arr[i][j]);
  }
}

출력:

Values of arr
arr[0][0] = 1
arr[0][1] = 2
arr[1][0] = 3
arr[1][1] = 4
arr[2][0] = 5
arr[2][1] = 6

Values of arr2
arr2[0][0] = 1
arr2[0][1] = 2
arr2[1][0] = 3
arr2[1][1] = 4
arr2[2][0] = 5
arr2[2][1] = 6

Values of arr after changing an element in arr2
arr[0][0] = 1
arr[0][1] = 2
arr[1][0] = 3
arr[1][1] = 4
arr[2][0] = 5
arr[2][1] = 6
작가: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

관련 문장 - Java Array