본문

Deep Copy vs. Shallow Copy

반응형

# Deep Copy (깊은복사)

배열이나 객체를 복사할 때, 원본과 같은 데이터를 저장하고 있는 새로운 객체나 배열을 생성하는 것.


$ Shallow Copy (얕은 복사)

배열이나 객체를 복사할 때, 단순히 참조만 복사하는 것.


shallow copy의 경우 원본이 변경되면 복사본도 같이 변경되는 것과 같은 결과를 얻고,

deep copy의 경우 원본의 데이터가 바뀐다 할지라도 복사본은 완전히 독립적인 객체이므로 전혀 영향을 받지 않는다.


Source01) deepAndShallowCopyEx01.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package deepAndShallowCopy;
 
import java.util.Arrays;
 
public class deepAndShallowCopyEx01 {
 
    public static void main(String[] args) {
        int[] data = { 01234 };
        int[] sCopy = null;
        int[] dCopy = null;
 
        sCopy = shallowCopy(data);
        dCopy = deepCopy(data);
 
        System.out.println("Original : " + Arrays.toString(data));
        System.out.println("Shallow : " + Arrays.toString(sCopy));
        System.out.println("Deep : " + Arrays.toString(dCopy));
        System.out.println();
 
        data[0= 5;
        System.out.println("data[0] = 5; 적용 후 결과");
        System.out.println();
 
        System.out.println("Original : " + Arrays.toString(data));
        System.out.println("Shallow : " + Arrays.toString(sCopy));
        System.out.println("Deep : " + Arrays.toString(dCopy));
 
    }
 
    // 얕은 복사
    private static int[] shallowCopy(int[] arr) {
        return arr;
    }
 
    // 깊은 복사
    private static int[] deepCopy(int[] arr) {
        if (arr == null)
            return null;
 
        int[] result = new int[arr.length];
 
        System.arraycopy(arr, 0, result, 0, arr.length);
        return result;
    }
}
cs

Result)

1
2
3
4
5
6
7
8
9
Original : [01234]
Shallow : [01234]
Deep : [01234]
 
data[0= 5; 적용 후 결과
 
Original : [51234]
Shallow : [51234]
Deep : [01234]
cs




shallow copy는 원본의 변경에 영향을 받고 deep copy는 원본이 변경되어도 영향을 받지 않는 것을 알 수 있다.



출처 및 참고자료 : JAVA의정석(남궁성 저)

반응형

공유

댓글