본문 바로가기

C# 공부/C# 기본 문법

클래스 - 1 (Static, 얕은/깊은 복사)

A. Static (정적) 필드, Static (정적) 메소드 

프로그램 전체에 걸쳐 공유해야 하는 변수, 메소드가 있다면 정적 필드, 정적 메소드를 사용하면된다.

class Global
{
    public static int Count = 0;
}
class ClassA
{
    public ClassA()
    {
        Global.Count++;
    }
}
class ClassB
{
    public ClassB()
    {
        Global.Count++;
    }
}

 

B. 객체 복사하기 

1. 얕은 복사 (Shallow Copy)

MyClass source = new MyClass();
source.MyField1 = 10;
source.MyField2 = 20;

MyClass target = source;
target.MyField2 = 30;

Console.WriteLine($"{source.MyField1},{source.MyField2}");// 10 30 출력
Console.WriteLine($"{target.MyField1},{target.MyField2}");// 10 30 출력

위 코드에서 알수있듯, 클래스는 태생이 참조형식이다. 

<참조형식은 힙에 객체를 할당하고, 스택에 있는 참조가 힙영역의 메모리를 가리킴>

따라서 위 소스에서 source를 복사해서받은 target은 힙의 객체가아닌 스택에있는 참조를 복사해서 받아오고, source와 target이 같은곳을 바라본다.

이렇게 객체를 복사할 때 참조만 살짝 복사하는 것을 얕은 복사라고 한다.

 

2. 깊은 복사 (Deep Copy)

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;
    }
}

target이 힙에 있는 내용을 source로 부터 복사받아 별도의 힙공간에 객체를 보관하는것을 깊은복사라 한다.

 

※ ICloneable.Clone() 메소드

.NET 프레임워크의 System 네임스페이스에는 ICloneable이라는 인터페이스가 있으며 "깊은 복사" 기능을 가질 클래스가 .NET 프레임워크의 다른 유틸리티 클래스나 다른 프로그래머가 작성한 코드와 호환되도록 하고 싶다면 ICloneable을 상속하는것이 좋다. ICloneable인터페이스는 Clone() 메소드 하나만 갖고있음.

class MyClass : ICloneable
{
	public int MyField1;
    public int MyField2;
    
    public MyClass Clone()
    {
    	MyClass newCopy = new MyClass();
        newCopy.MyField1 = this.MyField1;
        newCopy.MyField2 = this.MyField2;
    }
}