int[] arr1 = {a, b, c};라고 선언하고
int[] arr2 = arr1;이라고 선언, 할당하게 되면 a, b, c가
복사되는것이 아니라 그것들의 주소값이 복사된다. 만일 arr2의 값을
바꾸게 되면 arr1의 별도의 저장공간에 접근하여 값을 바꾸기
때문에 이렇게 할 경우 arr1에 영향이 미친다.
그래서 배열을 똑같이 만들고 싶을 때는 깊은 복사를 사용해야한다.
-깊은복사: 얕은 복사처럼 가짜 복사가 아닌 진짜 새로운 배열을 똑같이 만들고 싶을 때 사용. 실제 값을 가지고 있는 배열의 기본형의 값을 꺼내 복사하는 것이다. 깊은 복사에는 두 가지가 있다.
1. 반복문 for문을 통해 하나씩 꺼내서 복사해 주는 방법.
2. 깊은 복사 메서드인 clone()과(' = '싸인으로 복사했을때 문제가 생기는 것을 방지하기 위해서) Arrays.copyOf()가 있다.
1.for문을 이용하여 깊은 복사하기.
int[] a = {1, 2, 3, 4};
int[] b = new int[a.length];
for (int i = 0; i < a.length; i++) {
b[i] = a[i]; //깊은 복사
}
b[0] = 3; //b배열 0번째 값을 3으로 변경.(1 -> 3)
System.out.println(a[0]); // 1
2. clone()메서드 이용하여 깊은 복사
int[] a = {1, 2, 3, 4};
int[] b = a.clone(); //가장 간단한 방법
하지만 클론을 이용할 때 주의 해야 하는 것이 있는데 바로 2차원 이상의 배열에서는 얕은 복사로 동작한다는 것이다. 즉 배열 안에 배열을 가지고 있을 시 바깥 배열은 새로운 주소값을 가질수 있지만 안쪽 배열은 같은 주소값을 가지고 있기 때문에 근본적인 방법은 아니다.
결론적으로 Arrays.copyOf()메서드를 사용하는 것이 좋다.
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 2. Arrays.copyOf() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOf(a, a.length);
// 배열과 함께 length값도 같이 넣어준다.
}
}