Java - Shallow Copy vs Deep Copy
Primitive Type Copy
-
원시 타입의 복사는 다음과 같은 결과가 나온다.
int a = 100; int b = a; a = 1; System.out.println(a) // 1 System.out.println(b) // 100
-
원시타입은 Stack 메모리에 값이 직접 저장된다.
Reference Type Copy
-
참조 타입 복사는 다음과 같은 결과가 나온다.
int[] a = {1, 2, 3, 4, 5}; int[] b = a; a[0] = 100; System.out.println(Arrays.toString(a)) // [100, 2, 3, 4, 5] System.out.println(Arrays.toString(b)) // [100, 2, 3, 4, 5]
-
참조타입은 주소만 Stack 에 저장되고, 실제 값은 Heap 에 저장된다.
-
그래서 위 코드처럼 복사를 하면, 주소값을 복사하는거기 때문에 같은 Heap 의 값을 바라보게 된다.
-
그걸 얕은 복사 라고 이야기한다.
Shallow Copy
-
얕은 복사
-
객체를 그냥 = 으로 복사하는 개념으로, 동등이 아닌 동일하게 복사를 한다. ( 객체 주소 자체를 복사해서 옮김 )
TestClass a = new TestClass(); TestClass b = new TestClass(); a = b;
-
이렇게 할 시, a == b를 하면 true가 나온다.
-
재정의 하지 않은 clone();을 사용하거나, = 을 통하여 복사한 경우 이렇게 얕은 복사가 일어난다.
Deep Copy
-
깊은 복사
-
Cloneable 인터페이스를 implement 한 후, clone( )을 재정의하거나
-
새 메모리를 생성하여 값들을 하나하나 옮기거나 직렬화 역직렬화를 통해 Deep Copy를 수행할 수 있다.
-
객체 주소는 복사하지 않되, 내용은 그대로 복사하는 방법을 말한다.