java
얕은 복사 & 깊은 복사
CoMeangMeangIn
2024. 11. 1. 11:39
1. 얕은 복사 & 깊은 복사란?
얕은 복사 (Shallow copy) : 주소 값을 복사하는 행위
깊은 복사 (Deep copy) : 해당 주소의 실제 메모리에 저장된 값을 복사하는 행위
int[] a = {1,2,3}
// 얕은 복사
int[] b = a;
// 깊은 복사
int[] c = a.clone();
or
int[] c = new int[3];
for(int i = 0; i < a.length; i++){
c[i] = a[i];
}
2. clone()시 주의할 점
clone()은 객체의 주소의 실제 값들을 저장해주는 메서드이나, 메모리안에 주소가 저장된 경우 깊은 복사가 안 된다.
아래 비교 코드를 보면 알 수 있다.
public class Main {
public static void main(String[] args) {
int[][] a = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
//얕은 복사
int[][] b =a.clone();
System.out.print("a,b 배열안의 배열주소 비교 : ");
System.out.println(b == a? "같습니다" : "다릅니다");
for(int i = 0; i < b.length; i++){
System.out.print("a,b 배열안의 배열의 값 주소 비교 : ");
System.out.println(b[i] == a[i]? "같습니다" : "다릅니다");
}
System.out.println();
//깊은 복사
int[][] c = new int[a.length][a[0].length];
for(int i=0;i<a.length;i++){
c[i]=a[i].clone();
}
System.out.print("a,c 배열안의 배열주소 비교 : ");
System.out.println(c==a? "같습니다" : "다릅니다");
for(int i = 0; i < c.length; i++){
System.out.print("a,c 배열안의 배열의 값 주소 비교 : ");
System.out.println(c[i] == a[i]? "같습니다" : "다릅니다");
}
System.out.println();
}
}
출력 결과