// <이것은 C#이다> 3판 코드
using System;
namespace thisIsCSharp
{
class MyClass
{
public int MyField1;
public int MyField2;
public MyClass DeepCopy() // 깊은 복사
{
MyClass newCopy = new MyClass();
newCopy.MyField1 = this.MyField1;
newCopy.MyField2 = this.MyField2;
return newCopy;
}
}
class MainApp
{
static void Main(string[] args)
{
Console.WriteLine("===== 얕은 복사 =====");
MyClass source = new MyClass();
source.MyField1 = 10;
source.MyField2 = 20;
MyClass target = source; // 주소값 같은 얕은 복사
target.MyField2 = 30;
Console.WriteLine($"{source.MyField1} {source.MyField2}");
Console.WriteLine($"{target.MyField1} {target.MyField2}");
Console.WriteLine();
Console.WriteLine("===== 깊은 복사 =====");
MyClass _source = new MyClass();
_source.MyField1 = 10;
_source.MyField2 = 20;
MyClass _target = source.DeepCopy(); // 깊은 복사
_target.MyField2 = 30; // source랑 주소 달라
Console.WriteLine($"{_source.MyField1} {_source.MyField2}");
Console.WriteLine($"{_target.MyField1} {_target.MyField2}");
}
}
}
주소값만을 복사하는 얕은 복사는 하나를 바꾸면 같이 바뀐다. 사실상 같은 주소고 부르는 이름만 다른 셈이다.
객체 자체를 복사하는 깊은 복사의 경우 값은 같지만 데이터는 다르기 때문에 하나의 값이 수정된다고 해도 다른 객체에게 영향을 미치지 않는다.