순서

I. Deep / Shallow Copy
II. Deep / Shallow Copy Example
(C#제공 문법 활용 Example)

 


I. Deep / Shallow Copy

 

데이터의 저장이란 기본적으로 시스템의 내부 주소(메모리공간)에
해당 데이터를 넣어두는 것이고, 변수는 그 주소를 바라보고 있다.

그렇다면 이 저장된 데이터를 다른 변수에 복사하는 것은 두가지 의미를 가진다.

1. 말 그대로 Copy이다 하나를 똑같이 새롭게 복사하는 것이다.
    -> 참조된 객체 자체를 복사하는 우리가 생각하는 복사 (Deep Copy)

2. 데이터만 복사하기 위해서 그냥 같은 메모리 공간을 바라보고 있다.
    -> 같은 공간을 바라보기에 데이터의 변경이 일어나면 간섭이 발생한다. (Shallow Copy)

즉, Deep Copy는 내부에 참조된 객체 전체를 새롭게 복사해주고
  Shallow Copy는 복사 해주는 척 동일한 객체를 같이 참조하는 것이다.

 


II. Deep / Shallow Copy Example

 

C#에서는

깊은복사 : IClonable 인터페이스를,
얕은복사 : Object Class의 MemberwiseClone 인터페이스를 이용하여 구현한다.

C++처럼 주소를, 값을 복사하며 고민 할 필요가 없어진다.

 

1. Deep Copy Example

 

using System;

namespace DeepCopyApp {
  class CCard {
    public string name {
      get; set;
    }
  }
  
  // ICloneable Interface사용
  class CUser : ICloneable {
    public int age;
    public CCard card;
    
    public object Clone() { // 구현해야한다.
      CUser copyuser = new CUser();
      copyuser.age = this.age;
      copyuser.card = new CCard();
      copyuser.card.name = this.card.name;
      return copyuser;
    }
  }
  
  public class CMain {
    static void Main() {
      CUser user1 = new CUser();
      user1.age = 20;
      user1.card = new CCard();
      user1.card.name = "user1BC";
      
      CUser user2 = user1.Clone();
      user2.card.name = "user2BC"
      Console.WriteLine($"{user1.card.name}");
      Console.WriteLine($"{user2.card.name}");
    }
  }
}
출력
user1BC
user2BC

당연히 흔히 하는 생각대로 복사되서 서로 다른 값을 가지고 있다.

 

2. Shallow Copy  

 

using System;

namespace DeepCopyApp {
  class CCard {
    public string name {
      get; set;
    }
  }
  
  // ICloneable Interface사용
  class CUser {
    public int age;
    public CCard card;
    
    // MemberwiseClone 사용
    public object Clone() { 
      return this.MemberwiseClone();
    }
  }
  
  public class CMain {
    static void Main() {
      CUser user1 = new CUser();
      user1.age = 20;
      user1.card = new CCard();
      user1.card.name = "user1BC";
      
      CUser user2 = user1.Clone();
      user2.card.name = "user2BC"
      Console.WriteLine($"{user1.card.name}");
      Console.WriteLine($"{user2.card.name}");
    }
  }
}
출력
user2BC
user2BC

 

MemberwiseClone()을 사용하여 그저 객체 참조만 넘겨주어

user2의 변경점이 원래 user1에서도 변경이 된다. 즉, 같은 주소를 바라보고 있다.

함수에 인자를 넘겨줄 때 Call by Reference로 인자를 넘겨주는 것과 비슷한 진행방식이다.

+ Recent posts