728x90
클래스는 값 형식이 아니라 참조 형식이다.
참조 형식은 힙 영역에 객체(값)를 할당하고 스택에 있는 참조(주소)가 힙 영역에 할당된 메로리를 가르키는 것을 의미한다.
이렇게 객체를 복사할 때 참조(주소)를 복사하는 것을 얕은 복사라고 한다.
아래는 얕은 복사 예제이다.
class MyClass
{
public int MyField1;
public int MyField2;
}
MyClass source = new MyClass();
source.MyField1 = 10;
source.MyField2 = 20;
MyClass target = source;
target.MyField2 = 30;
Console.WriteLine("{0} {1}", source.MyField1, source.MyField2);
Console.WriteLine("{0} {1}", target.MyField1, target.MyField2);
// 출력 결과
// 10 30
// 10 30
참조(주소)를 복사했기 때문에 같은 곳을 참조하게 되어서 같은 값의 출력 결과가 나오게 된다.
깊은 복사는 직접 구현해야 한다. 깊은 복사 기능을 가질 클래스가 .NET 프레임워크의 다른 유틸리티 클래스나 다른 프로그래머가 작성한 코드와 호횡되도록 하고 싶으면 ICloneable 인터페이스를 상속하도록 하는게 좋다.
class MyClass : ICloneable
{
public int MyField1;
public int MyField2;
public object Clone()
{
MyClass newCopy = new MyClass();
newCopy.MyField1 = this.MyField1;
newCopy.MyField2 = this.MyField2;
return newCopy;
}
}
Console.WriteLine("Deep Copy");
{
MyClass source = new MyClass();
source.MyField1 = 10;
source.MyField2 = 20;
MyClass target = source.Clone() as MyClass;
target.MyField2 = 30;
Console.WriteLine("{0} {1}", source.MyField1, source.MyField2);
Console.WriteLine("{0} {1}", target.MyField1, target.MyField2);
}
// 출력 결과
// 10 20
// 10 30
728x90
'C#' 카테고리의 다른 글
form이 show인지 showdialog인지 체크하는 방법 (0) | 2023.01.03 |
---|---|
TopLevel, TopMost 차이 (0) | 2023.01.02 |
Find vs FirstOrDefault (0) | 2022.12.19 |
Delegate에 대한 이해 (0) | 2022.12.17 |
[DevExpress] GridControl 헤더에 체크박스 넣기 (0) | 2022.12.17 |