Shallow Vs Deep Copy 깊은 복사

Program/C# 2008. 3. 7. 15:25

C# 은 기본 적으로 얕은 복사를 기반으로 합니다.
C/C++ 의 포인터 개념처럼...
처음 C# 을 하게 되면서 의식하지 않고 놓쳤던 부분이네요..

엄밀히 말하면 구조체는 깊은 복사, 클래스는 얕은 복사를 기본으로 하죠..
C# 에서 타입은 클래스로 되어 있습니다.
그렇다면 모든 타입의 인스턴스에 대한 복사는 얕은 복사인가..
그렇지 않습니다.
실제적으로  int  를 예로 들면 깊은 복사가 행해 집니다.
이는 내부적으로 깊은 복사의 처리를 대행 하기 때문입니다.

그렇다면 우선 깊은 복사가 진행되는 타입과 얕은 복사가 진행되는 타입에 대해서 먼저 숙지 해야 할 것입니다.
MSDN ㄱㄱ 잠깐 보면 대충 감이 잡히실 겁니다.

그럼 깊은 복사를 하는 방법을 알아보도록하죠..
깊은 복사를 하는 함수를 따로 빼도 되고 IClonable 인터페이스를 상속받은후
Clone() 함수를 구현 해줘도 됩니다..

방법 1 :  MemberwiseClone()함수를 이용

ICloneable 함수를 상속 받았다 가정하면..
object Clone()
{
       return this.MemberwiseClone();
}

간단하죠? 이렇게 쉽게 끝날리가 없습니다. ㅎㅎ
MSDN 에 MemberwiseClone 함수를 검색해 보면 Shallow Copy 라고 명시하고 있습니다.
요놈은 확실히 얕은 복사 입니다.
정확히 말하면 복사하려는 클래스가 가진 필드중..
값을 가지는 필드에 대해서는 깊은 복사를 참조를 가진 필드에 대해서는 얕은 복사를..
수행하게 됩니다.
간단히 예제를 만들어서 요놈으로 깊은 복사를 시도 해보신분들은 착각하기 딱 좋죠..

방법 2 : 메모리 시리얼라이징

            MemoryStream mem = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();

            bf.Serialize(mem, obj);
            mem.Position = 0;

            object result = bf.Deserialize(mem);
            mem.Close();

이렇게 한 후 result 를 리턴 해주게 되면.. 메모리 상의 깊은 복사가 됩니다.
시리얼라이즈를 자주 사용하게 되면 시스템이 느려진다 던데..
그것 까진 잘 모르겠군요...

방법 3 : 이건 생각만 해본 바 인데...
MemberwiseClone() 를 참조 필드마다 모두 적용시킨다면..?
참조 필드가 많고 다층이라면 빡시겠군요...

'Program > C#' 카테고리의 다른 글

XML Serialize  (0) 2008.04.01
컨트롤에 컨트롤 넣기 DataTemplate, FrameworkElementFactory  (1) 2008.03.07
CreateDirectory 사용권한  (0) 2008.03.06
: