Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# .NET에서 개체의 깊은 복사(Deep Copy) 수행 방법

.NET에서 개체를 복사할 때는 얕은 복사(Shallow Copy)깊은 복사(Deep Copy) 두 가지 방식을 이해하는 것이 중요합니다. 이 글에서는 특히 깊은 복사가 무엇인지, 그리고 C#에서 어떻게 구현하는지 예제와 함께 자세히 살펴보겠습니다.

깊은 복사(Deep Copy)란?

깊은 복사는 원본 개체의 모든 것을 복제하는 방식입니다. 컬렉션을 깊은 복사하면 원본 컬렉션의 모든 요소까지 새롭게 복제된 두 개의 독립적인 컬렉션이 생성됩니다.

즉, 깊은 복사는 내부에 포함된 참조 형식(reference type)들까지 완전하게 복사하여, 원본과 복사본이 서로 완전히 독립적인 개체가 되도록 만듭니다.

다르게 표현하면, 깊은 복사란 개체를 복사할 때 해당 개체가 참조하고 있는 다른 개체들까지 함께 복사하는 것을 의미합니다. 따라서 복사본의 값을 변경해도 원본에는 아무런 영향을 주지 않습니다.

C# 깊은 복사 예제

다음 예제는 간단한 클래스를 사용하여 깊은 복사의 동작 방식을 보여줍니다.

class DeepCopy {
    public int a = 10;
}
class Program {
    static void Main() {
        // 깊은 복사
        DeepCopy d = new DeepCopy();
        d.a = 10;
        DeepCopy d1 = new DeepCopy();
        d1.a = d.a; // 값만 복사
        Console.WriteLine("{0} {1}", d1.a, d.a); // 10 10
        d1.a = 5; // 복사본의 값 변경
        Console.WriteLine("{0} {1}", d1.a, d.a); // 5 10
        Console.ReadLine();
    }
}

실행 결과

10 10
5 10

코드 설명

위 예제에서 d1d와 별개로 새로 생성된 개체이며, 필드 값만 복사했습니다. 따라서 d1.a의 값을 5로 변경한 후에도 원본인 d.a는 여전히 10으로 유지됩니다. 이것이 바로 깊은 복사의 핵심 특징입니다.

반면 얕은 복사의 경우 참조 주소만 복사되기 때문에, 복사본의 값을 변경하면 원본의 값도 함께 변경됩니다. 실무에서는 값 타입(int 등)뿐 아니라 중첩된 참조 형식까지 독립적으로 복사해야 할 때 ICloneable 인터페이스 구현, 직렬화(Serialization) 활용, 또는 복사 생성자 작성 등의 방법으로 깊은 복사를 구현할 수 있습니다.