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 Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn