프로그램/C# 2013. 3. 25. 22:05

C# 깊은복사

출처:http://ksh6438.blog.me/20166470651

위 출처작성자와 본글 작성자 동일

 

깊은 복사 참조 타입은 값 타입과는 달리 대입에 의해 똑같은 객체를 생성할 수 없다. 

참조 타입끼리의 대입은 힙에 있는 객체의 번지만을 대입하는 것이므로 두 객체는 같은 대상을 

가리키고 있으며 그래서 한 쪽을 변경하면 다른 쪽도 같이 영향을 받는다. 

참조만 복사하는 이런 복사를 얕은 복사라고 한다. 대입에 의해 완전히 독립적인 사본을 생성하려면 

깊은 복사를 해야 하는데 이때는 ICloneable 인터페이스를 상속받아 Clone이라는 

메서드를 구현해야 한다.


Object Clone() 

인수는 취하지 않으며 자신과 똑같은 타입의 객체를 만들어 리턴한다. 임의의 타입에 대해서도 

사본을 리턴할 수 있어야 하므로 리턴 타입은 object이다. 

다음 예제는 Clone 메서드를 구현해서 깊은 복사를 한다.

class Basic : ICloneable
{
public int data;
      public Basic(int val)
      {
          data = val;
      }
      public object Clone()
      {
          return new Basic(data);
      }
}
 
Basic A = new Basic(1234);
Basic B = (Basic)A.Clone();
B.data = 4123;
Console.WriteLine("A = {0}, B = {1}", A.data, B.data);

Clone에서 자신의 값과 동일한 객체를 생성해서 리턴 함으로써 완전한 사본을 만든다. 

B를 A의 사본으로 만들고 싶을 때는 A의 Clone 메서드를 호출하면 된다. 이때 Clone은 

object를 리턴하므로 반드시 원하는 타입으로 캐스팅해야 한다. 

Clone에 의해 완전히 새로운 사본이 만들어지므로 B를 어떻게 수정하더라도 원본에는 

영향을 미치지 않는다

 

'프로그램 > C#' 카테고리의 다른 글

C# 윈도우7 관리자 권한 얻기  (0) 2013.03.25
C# 리스트뷰 체크된 아이템 얻기  (0) 2013.03.25
크로스 스레드 해결법  (0) 2013.03.19
C# 화면 캡쳐  (0) 2013.03.12
C# MDI 폼안에 폼 띵우기  (0) 2013.03.12