[객체지향 프로그래밍] 7장-3 깊은 복사,얕은 복사

0

이것이 C#이다

목록 보기
10/26

7.5 객체의 깊은 복사와 얕은 복사

입력

class MyClass
{
	public int MyField1;
	public int MyField2;
}

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

//source를 복사하여 target에 넣는다
MyClass target = source;
target.MyField2 = 30;

Console.WirteLine($"{source.MyField1},{source.Myfield2}");

Console.WirteLine($"{target.MyField1},{target.Myfield2}");

💻 출력
10 30
10 30

위 코드는 복사를 제대로 수행하지 못했습니다. target의 MyField2의 값만 바꾸려고 했는데 source의 MyField2 값도 같이 바뀌어버렸거든요.
이렇게 얕은 복사가 일어난 까닭은 클래스는 복합 데이터형식이면서 참조 형식이기 때문입니다.
(구조체처럼 모든 복합 데이터 형식이 참조형식은 아닙니다. 구조체는 값형식!)
Myclass target = source;
이 부분은 복사를 수행한것이 아니라 target에게 source의 힙을 같이 가리키도록 명령한것입니다.

[객체 얕은 복사]

[객체 깊은 복사]

우리가 원하는 깊은 복사는 target이 힙에 보관되어 있는 내용을 source로부터 복사하여, 별도의 힙 공간에 보관하기를 바라는 것입니다.

안타깝게도 C#에서는 깊은복사를 자동으로 해주는 구문이 없습니다. 따라서 깊은 복사를 스스로 구현해야 합니다.

깊은복사 구현

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

인터페이스 ICloneable과 Clone메소드
System 네임스페이스에는 ICloneable이라는 인터페이스가 있습니다. 깊은복사 기능을 가직 클래스가 .Net의 다른 클래스나 다른 프로그래머가 작성한 코드와 호환되도록 하고 싶다면 ICloneable을 상속하는것이 좋습니다.

class MyClass : ICloneable	//인터페이스 사용
{
	public int MyField1;
    public int MyField2;
    
    //객체를 힙에 새로 할당해서 그곳에 자신의 멤버를 일일이 복사해서 넣습니다.
    public MyClass Clone()	
    {
    	MyClass newCopy = new MyClass();
        newCopy.MyField1 = this.MyField1;
        newCopy.MyField2 = this.MyField2;
        
        return newCopy;
    }
}

0개의 댓글