유니티 C# : C#의 깊은 복사 동작


C++ 에서도 얕은 복사와 깊은 복사 동작이 있었다.

기본 복사 생성자에 의해 얕은 복사가 진행되어

깊은 복사 동작은 우리가 직접 정의해 줬어야했다.




C#도 클래스의 기본 복사동작은 얕은 복사를 하고 있는데

깊은 복사를 정의하는 과정과 사용방법이 C++과

다른 점이 있어 포스팅을 하게 되었다.




우선 C#은 값 형식과 참조 형식으로 나누어지는데

클래스의 인스턴스는 태생부터 참조 형식이다.

때문에 단순히 대입을 하여 복사를 할 경우,

힙에 있는 인스턴스가 복사가 되는 것이 아니라

스택에 이 인스턴스를 가리키는 놈이 하나 더 생성된다.

(요기 까지는 C++의 문제점과 다를게 없다.)




자 그럼 간단하게 코드를 작성해보자.


class MyClass{


public int MyField1;

public int MyField2;


public MyClass DeepCopy(){


MyClass newCopy = new MyClass();

newCopy.MyField1 = this.MyField1;

newCopy.MyField2 = this.MyFiedl2;


return newCopy;

}

}


class Main{

static void main(string[] args) {


MyClass source = new MyClass();

source.MyField1 = 10;

source.MyField2 = 20;


MyClass target = source.DeepCopy();

target.MyField = 30;


}

}



이제 위의 예에서는 깊은 복사가 진행되어

source와 target이 힘에 서로 다른 객체를 가리킬 수 있다.

따라서 우리가 예상했던 결과가 나올 것이다.




또 하나 중요한 부분은 ICloneable.Clone() 메소드이다.

.NET 프레임워크의 System 네임스페이스에는 ICloneable

이라고 하는 인터페이스가 있다. 깊은 복사 기능을 가질

클래스가 .NET 프레임워크의 다른 유틸리티 클래스나

다른 프로그래머가 작성한 코드와 호환되도록 하고 싶다면

ICloneable을 상속하도록 하는 것이 좋다. ICloneable

인터페이스는 Clone() 메소드 하나만을 가지고 있다.




class MyClass : ICloneable{


public int MyField1;

public int MyField2;


public Object Clone(){

MyClass newCopy = new MyClass();

newCopy.MyField1 = this.MyField1;

newCopy.MyField2 = this.MyFiedl2;


return newCopy;

}

}



이제 이 클래스는 .NET 프레임워크와 호환성을 가지게 된다.

(Object로 반환 받을 수 있는 이유는 C#의 모든 데이터 형식은

Object를 상속받기 때문 : 전 포스팅 박싱/언박싱 참조)



+ Recent posts