배열을 복사를 하려고 하는데 변수처럼 '=' 연산자로 넣으면 쉽게 되겠네? 라고 생각을 했다가 문제가 생겨서 한참을 찾아 헤맨 기억이 있습니다.. 자바의 정석에서 마침 이 파트가 있어 개인적으로 정리를 포스팅 하게 되었습니다.
우선 배열의 복사는 for문을 이용하여 배열을 복사하는 방법 ( 값을 for문을 돌며 다 넣어주기) , '=' 연산자를 사용하는 방법 ( ex. arr = arr2 ), System.arraycopy( ) 를 이용하여 배열을 복사하는 방법이 있습니다.
for문 이용하여 값을 넣거나 System.arraycopy( ) 는 Deep copy(깊은 복사) 로서 '실제값'을 넣어주게 되지만
arr = arr2 와 같은 방식은 Shallow copy(얕은 복사)로 '주소값'을 복사하게 됩니다.
그러면 어떤 차이가 있는지 아래 코드를 보시면 쉽게 이해를 하실 수 있습니다.
public class arrExam {
public static void main(String[] args) {
char[] arr = {'a', 'b', 'c', 'd', 'e'};
char[] arr2 = {'f', 'g', 'h', 'i', 'j'};
System.out.println(arr);
System.out.println(arr2);
System.out.println();
//arr[0]번을 arr2[0]부터 arr의 길이만큼 '값'을 복사한다.
System.arraycopy(arr, 0, arr2, 0, arr.length);
System.out.println(arr); // a, b, c, d, e
System.out.println(arr2); // a, b, c, d, e
System.out.println();
//arr의 0번째 1번째 값을 변경한다!
arr[0] = 'v';
arr[1] = 'w';
//arr의 값만 변경하게 되었다.
System.out.println(arr); // v, w, c, d, e
System.out.println(arr2); // a, b, c, d, e
System.out.println();
arr2 = arr; //arr2는 arr의 주소를 가리킴!
//이번에도 arr의 값만 변경한다.
arr[0] = 'V';
arr[1] = 'W';
//arr2는 arr의 주소를 가리키기 때문에 해당 주소의 값을 가지게 된다.
System.out.println(arr); // V, W, c, d, e
System.out.println(arr2); // V, W, c, d, e
System.out.println();
}
}
'실제 값' 을 복사했을 경우에는 arr 와 arr2 는 서로 영향을 주지 않았다. 왜냐하면 다른 주소값을 가지기 때문입니다.
하지만 '=' 를 사용하게 되었을 땐 주소값을 복사하게 됩니다. 즉 arr의 값이 변경이 되면 arr2의 값이 변하지 않을 것 같지만 arr2는 arr 주소를 가리키게 되므로 arr의 값을 출력하게 됩니다.
배열의 복사를 알아보며 얕은복사와 깊은복사를 간단하게 알아봤는데 도움이 되셨으면 좋겠습니다. 감사합니다.
'자바 (ref. 자바의정석)' 카테고리의 다른 글
오버로딩(overloading) - JAVA (0) | 2022.02.14 |
---|---|
클래스변수, 인스턴스변수, 지역변수 - JAVA (0) | 2022.02.09 |
for each 문 - JAVA (0) | 2022.02.07 |
문자열의 비교 - JAVA (0) | 2022.02.06 |
상수와 리터럴 - JAVA (0) | 2022.02.05 |