얕은 복사와 깊은 복사
복사하려는 원본 객체에 대해서 새로운 단일 객체 또는 새로운 복합 객체를 만들고 원본 객체를 참조한다. 즉, 다양한 복합 멤버 변수를 갖고 있는 객체가 인스턴스가 생성될 때 인스턴스화 되면서 메모리에 할당된 주소의 값을 참조한다. 또한 얕은 복사는 복사 객체가 원본 객체에 종속적이다.
얕은 복사는 주소에 의한 참조 즉, call-by-reference와 유사한 개념이 된다.
복사하려는 원본 객체에 대해서 새로운 단일 객체 또는 새로운 복합 객체를 만들고 원본 객체를 대상으로 인스턴스화할 수 있는 클래스 내부의 클래스 변수(static)와 메서드(static)뿐 아니라 인스턴스 값 모두를 복사하여 원본 객체로부터 독립적인 객체를 생성한다.
깊은 복사는 새로운 객체가 원본 객체 자체를 Copy 하는 것이다. 즉, call-by-values와 유사한 개념이 된다.
얕은 복사(shallow copy)는 원본 객체는 하나인 상태에서, 참조 값만 복사한다.
깊은 복사(deep copy)는 원시 값처럼 완전한 복사본을 만든다.
얕은 복사와 깊은 복사를 정리하면 다음과 같다.
새로운 B객체를 생성 후 원본 A객체를 메모리 영역을 참조해서 원본에 종속된 객체를 생성하는 것이 얕은 복사이다.
새로운 B객체를 생성 후 원본 A객체를 통째로 복사해서 독립적인 새로운 객체를 메모리 영역에 생성하는 것이 깊은 복사이다.
위 그림은 다양한 멤버 변수 값들을 갖는 클래스 Box이다.
인스턴스화하는 과정을 간단하게 설명하면 Box라는 컴퓨터로 구현할 개념을 객체로 본다. 이 객체를 설계한 것이 클래스이며, 클래스를 실제로 컴퓨터에 메모리에 값에 할당하는 것이 인스턴스 화이다.
Shallow Copy
인스턴스화하여 객체를 메모리에 할당했을 때이다. 얕은 복사는 원본 객체 A와 복사 객체 B가 하나의 할당받은 영역을 지정하여 원본 객체 A가 변경되는 경우 B도 똑같은 메모리 상의 영역을 참조하고 있기 때문에 값이 종속적으로 변경된다. 이것이 얕은 복사이다.
Deep Copy
위 그림은 좌측은 원본 객체 A이며, 우측은 복사 객체 B이다. 위의 화살표는 A 객체의 있는 내용들을 모두 복사해서 새로운 메모리 영역에 있는 B객체를 할당해 준 것이다. 이때 A와 B는 컴퓨터로부터 각각 다른 메모리 영역을 배정받았으므로 A객체를 수정하거나 B객체를 수정해도 값에 변화가 없는 것이 깊은 복사이다.