객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조하는 것
int[] arr1 = new int[4];
int[] arr2 = arr1;
public class ArrayExample2 {
// 얕은 복사 (shallow: 얕은)
// => 주소를 복사하여 서로 다른 두 변수가 (같은 주소!!)
// 하나의 배열(또는 객체)을 참조하는 상태를 만드는 복사 방법
public void shallowCopy() {
int[] arr = { 1, 2, 3, 4, 5 };
// 얕은 복사 진행
int[] copyArr = arr; // 주소만 복사
System.out.println("copyArr 주소 확인 : " + copyArr); // copyArr 주소 확인 :[I@1eb44e46
System.out.println("arr 주소 확인 : " + arr); // arr 주소 확인 : [I@1eb44e46
// 배열 값 변경
System.out.println("변경 전");
System.out.println("arr: " + Arrays.toString(arr)); // arr: [1, 2, 3, 4, 5]
System.out.println("copyArr: " + Arrays.toString(copyArr)); // copyArr: [1, 2, 3, 4, 5]
// 얕은 복사한 배열의 값 변경
copyArr[2] = 999;
// 배열 값 변경 확인
System.out.println("변경 후");
System.out.println("arr: " + Arrays.toString(arr)); // arr: [1, 2, 999, 4, 5]
System.out.println("copyArr: " + Arrays.toString(copyArr)); // copyArr: [1, 2, 999, 4, 5]
}
새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사하는 것
→ 완전 복사이기 때문에 복사한 배열이 참조하고 있는 곳의 값을 변경해도 원본 배열의 값은 변경되지 않음
// 방법 1
for(int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
// 방법 2
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
// 방법 3
arr2 = Arrays.copyOf(arr1, arr1.length);
~~arr2 = arr1.clone();~~
// clonable을 재정의해서 규칙을 정해 쓰는 녀석이라 복잡하고,
// 무한대 복사될 수 있으므로 사용 안할 예정
깊은 복사 방법
arraycopy()
메소드 이용하기copyOf()
메소드 이용하기public void deepCopy() {
int[] arr = { 1, 2, 3, 4, 5 }; // 원본
// 1. for문을 이용한 깊은 복사
int[] copyArr1 = new int[arr.length]; // 5칸짜리 배열 생성
for (int i = 0; i < arr.length; i++) {
copyArr1[i] = arr[i];
}
// 2. System.arraycopy(원본배열, 원본 복사 시작 인덱스, 복사 배열, 복사배열 삽입 시작 인덱스, 복사길이)
int[] copyArr2 = new int[arr.length];
System.arraycopy(arr, 0, copyArr2, 0, arr.length);
// 3. Arrays.copyOf(원본 배열, 복사할 길이)
int[] copyArr3 = Arrays.copyOf(arr, arr.length);
// 값 변경 후 확인
copyArr1[4] = 0;
copyArr2[4] = 10;
copyArr3[4] = 100;
System.out.println("arr: " + Arrays.toString(arr));
System.out.println("copyArr1: " + Arrays.toString(copyArr1));
System.out.println("copyArr2: " + Arrays.toString(copyArr2));
System.out.println("copyArr3: " + Arrays.toString(copyArr3));
}