객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조하는 것
원본이 바뀌면 복사본도 바뀐다!
int[] arr1 = new int[4];
int[] arr2 = arr1;
arr1[2] = 100 이면 arr2[2] = 100 이다 (원본이 바뀌면 복사본도 바뀜)

int[] arr = {1, 2, 3, 4, 5}; // 선언과 동시에 초기화
int[] copyArr = arr; // 주소만 복사
System.out.println("변경 전");
System.out.println("arr 주소 : " + arr); // [I@2ff4acd0
System.out.println("copyArr 주소 : " + copyArr); // [I@2ff4acd0
System.out.println("arr : " + Arrays.toString(arr)); // [1, 2, 3, 4, 5]
System.out.println("copyArr : " + Arrays.toString(copyArr)); // [1, 2, 3, 4, 5]
// 얕은 복사한 배열의 값을 변경
copyArr[2] = 999;
System.out.println("변경 후");
System.out.println("arr : " + Arrays.toString(arr)); // [1, 2, 999, 4, 5]
System.out.println("copyArr : " + Arrays.toString(copyArr)); // [1, 2, 999, 4, 5] => 같은 객체, 같은 주소값을 갖고있기 때문에
새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사하는 것
집이 다르기 때문에 하나의 배열을 수정해도 나머지가 변경되지는 않음
ex)
arr1[1] = 100;
arr2[1] = 2;
1. for문을 이용하여 데이터 하나씩 직접 복사
-> for(int i = 0; i < arr1.length; i++){
arr2[i] = arr1[i];
2. System.arraycopy() 메서드 이용
-> System.arraycopy(arr1, 0, arr2, 0, arr1.length);
3. Arrays 클래스에 copyOf() 메서드 이용
-> arr2 = Arrays.copyOf(arr1, arr1.length);

int[] arr = {1, 2, 3, 4, 5}; // 원본
// 1. for문을 이용한 깊은 복사
int[] copyArr1 = new int[arr.length]; // 5칸짜리 배열 생성 (배열공간만 생성, 대입은 아직x)
// 그러나 Heap영역은 비어있을 수 없어서 JVM에서 0을 넣음
for(int i = 0; i < arr.length; i++) {
copyArr1[i] = arr[i];
}
System.out.println("arr 주소 : " + arr); // [I@2ff4acd0
System.out.println("copyArr1 주소 : " + copyArr1); // 주소값은 다름 [I@38af3868
System.out.println("arr : " + Arrays.toString(arr)); // [1, 2, 3, 4, 5]
System.out.println("arr : " + Arrays.toString(copyArr1)); // 데이터는 복사됨 [1, 2, 3, 4, 5]
// 2. System.arraycopy(원본 배열, 원본복사 시작 인덱스,
// 복사 배열, 복사배열의 삽입 시작 인덱스, 복사 길이);
int[] copyArr2 = new int[arr.length];
System.arraycopy(arr, 0, copyArr2, 0, arr.length);
System.out.println(Arrays.toString(copyArr2)); // [1, 2, 3, 4, 5]
// 3. 복사할 배열 참조변수 = Arrays.copyOf(원본배열, 복사할 길이);
int[] copyArr3 = Arrays.copyOf(arr, arr.length); // new int해서 미리 할당을 안 시켜줘도 됨
System.out.println("copyArr3 : " + Arrays.toString(copyArr3)); // [1, 2, 3, 4, 5]
// 값 변경 후 확인
copyArr1[4] = 0;
copyArr2[4] = 999;
copyArr3[4] = 5000;
System.out.println("arr : " + Arrays.toString(arr));
System.out.println("copyArr1 : " + Arrays.toString(copyArr1)); // [1, 2, 3, 4, 0]
System.out.println("copyArr2 : " + Arrays.toString(copyArr2)); // [1, 2, 3, 4, 999]
System.out.println("copyArr3 : " + Arrays.toString(copyArr3)); // [1, 2, 3, 4, 5000]