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();
    }
}

 

출력 결과