Java
[Java] 얕은 복사와 깊은 복사
Junuuu
2021. 11. 15. 11:56
반응형
얕은 복사(shallow copy)
한쪽에서 수정이 발생되면 다른쪽에도 영향을 끼쳐 같아지게 된다.
주소값을 복사하기 때문에 주소로 값을 참조하여 값이 변경되면 해당 값을 참조하고 있는 변수의 값이 모두 변경된다.
= 연산자는 얕은 복사를 수행한다.
아래는 코드 예시이다.
int[] a= new int[]2;
a[0] = 2;
a[1] = 4;
int[] b = a;
b[0] = 6;
b[1] = 8;
System.out.println(a[0] + " " + a[1]);
System.out.println(b[0] + " " + b[1]);
System.out.println(a);
System.out.println(b);
//결과
6,8
6,8
[I@36baf30c //a의 주소
[I@36baf30c //b의 주소
위의 코드처럼 =연산자를 사용하여 얕은 복사를 진행하게 되면 복사된 배열의 값이 변경될 때, 원본 배열의 값도 변경된다. (a와 b를 출력해보면 둘다 a의 주소를 참조하고 있기 때문입니다.)
이를 해결하기 위해서는 깊은 복사를 사용해야 한다.
깊은 복사(Deep copy)
깊은 복사는 주소값을 참조하는 것이 아닌, 새로운 메모리 공간에 값을 복사하는 것이기 때문에 원본 배열이 변경되어도 복사된 배열에 전혀 상관이 없다.
int[] a= new int[2];
a[0] = 2;
a[1] = 4;
System.out.println(a[0] + " " + a[1]);
System.out.println(a);
int[] b = a.clone();
System.out.println(b[0] + " " + b[1]);
System.out.println(b)
b[0] = 6;
b[1] = 8;
System.out.println(a[0] + " " + a[1]);
System.out.println(b[0] + " " + b[1]);
//결과
2,4 //a0, a1
[I@36baf30c // a의 주소
2,4 //b0, b1
[I@7a81197d // b의 주소
2,4 //a0, a1
6,8 //b0, b1
clone 메소드를 사용하게 되면 a와 b가 참조하는 주소값이 다른것을 확인할 수 있습니다.
출처
https://woovictory.github.io/2020/04/22/Java-Array-Copy/
[Java] 얕은 복사와 깊은 복사
배열의 복사와 관련해서는 얕은 복사와 깊은 복사의 차이점을 알아야 한다.
woovictory.github.io
[JAVA] Object.clone(), 얕은 복사, 깊은 복사, 복사 생성자
Obejct 클래스에는 clone() 메서드가 정의되어 있습니다. clone 메서드는 네이티브 메서드로 해당하는 객체의 모든 필드를 복사하여 새로운 객체에 넣어 반환하는 동작을 수행합니다.위 코드가 Object
velog.io