본문 바로가기

C++ Programming/이것이 C++이다

깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy), ICloneable 인터페이스, 프로토타입 패턴

http://itwillcampus.tistory.com/748 참조

객체가 복사된다는 것은 기존 객체와 같은 값을 가지는 새로운 객체를 만든다는 것이다.
객체가 가진 값 형식과 참조형식의 복제방식에 따라 얕은 복사,깊은 복사로 개념이 나뉜다.

1. shallow copy(얕은 복사)
   - 단순복사로서 만일 객체가 참조타입의 멤버를 가지고 있다면 참조값만 복사된다.

person1 객체가 복사된 person2 는 새로운 객체이긴 하나 참조 멤버인 Car 에 대해서는 동일한 객체참조를 가지고 있다.

(person2 에서 Car Model 값을 변경하니 person1 도 변경되었다)

 









2. Deep Copy (깊은 복사)
 

객체가 참조타입의 멤버를 포함할 경우 참조값의 복사가 아닌 참조된 객체 자체가 복사되는 것을 깊은 복사라 한다.

결국 아래와 같이 실현하고자 함이다.











3. ICloneable 인터페이스

닷넷 프레임웍에서는 이와 같이 깊은 복사를 위해 ICloneable 인터페이스를 제공한다.

이 인터페이스는 단 하나의 메서드, Clone 메서드가 정의되어 있다.

(프레임웍 내의 클래스라이브러리에 수많은 클래스들이 이 인터페이스를 구현하여 실제

객체 복사를 지원한다)

만일 우리의 Person/Car 시나리오를 깊은 복사 가능 객체로 만들려면 프레임웍의 클래스들이 그렇게 했듯

IConeable 를 직접 구현할 수 밖에 없다.

 

Person 객체의 Clone 메서드는 결국 자기 자신의 멤버값들을 그대로 대입시킨 새로운 Person 객체를 생성해서 반환하도록 한다.  이 때 Car 객체 역시 new 로 완전히 새로운 객체로 생성하도록 하는게 핵심이다. 

4. 프로토 타입 패턴
 

복사(복제)과 관련된 디자인 패턴은 대표적으로 프로토 타입 패턴이 있다.

프로토타입 패턴은 복제를 통한 객체 생성을 지원함으로써 객체생성 과정의 캡슐화 및 객체생성의 편리성을 제공하는 기법이다.