본문 바로가기
C#

[C#] 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)의 이해

by ifhead 2022. 9. 10.
반응형

얕은 복사 Shallow Copy

  • 참조만 복사합니다. 복사된 객체를 수정하면 원본 객체도 바뀝니다.
  • 주의하세요!

얕은 복사의 예시

class Person
{
    public string Name;
    public int Age;
}

Person person1 = new Person { Name = "John", Age = 30 };
Person person2 = person1; // Shallow copy

person2.Age = 35;

Console.WriteLine(person1.Age); // Output: 35

이 예제에서 person1과 person2는 두 개의 다른 오브젝트이지만 동일한 주소 오브젝트를 공유합니다.

 

깊은 복사 Deep Copy

  • 객체의 독립적인 복사본을 만들 때 사용합니다. 

 

깊은 복사의 예시

class Person
{
    public string Name;
    public int Age;

    public Person DeepCopy()
    {
        Person newCopy = new Person();
        newCopy.Name = this.Name;
        newCopy.Age = this.Age;
        return newCopy;
    }
}

static void Main(string[] args)
{
    Person person1 = new Person();
    person1.Name = "John";
    person1.Age = 30;

    Person person2 = person1.DeepCopy();
    person2.Age = 35;

    Console.WriteLine($"Person 1: {person1.Name}, {person1.Age}");
    Console.WriteLine($"Person 2: {person2.Name}, {person2.Age}");
}

    // Person 1: John, 30
    // Person 2: John, 35

이렇게 하면 person1을 수정해도 person2에게 영향을 미치지 않습니다.

 

얕은 복사는 언제 사용하는가?

예 1: 불변 객체

객체가 변경 불가능한 경우, 즉 객체가 생성된 후 속성을 수정할 수 없는 경우 얕은 복사본을 사용해도 안전합니다. 이 경우 원래 개체와 얕은 복사본 모두 항상 동일한 값을 가지며 공유 데이터 수정으로 인해 예기치 않은 동작이 발생할 위험이 없습니다.

class Person {
    private readonly string Name = "John";
    private readonly int Age = 30;
 
    public Person ShallowCopy() => (Person)this.MemberwiseClone();
}

var person1 = new Person();
var person2 = person1.ShallowCopy();

이 예에서 person1과 person2는 둘 다 불변 객체이므로 얕은 복사본을 사용해도 안전합니다.

 

예 2: 성능 최적화

경우에 따라 대용량 그래프의 심층 복사본을 만드는 데 메모리 및 성능 면에서 비용이 많이 들 수 있습니다.

특정 작업에 데이터의 하위 집합만 필요한 경우에는 얕은 복사본을 사용하는 것이 더 효율적인 옵션이 될 수 있습니다.

class Person {
    public string Name { get; set; }
    public int Age { get; set; }
    public List<string> Friends { get; set; }
 
    public Person(string name, int age, List<string> friends) {
        Name = name;
        Age = age;
        Friends = friends;
    }
 
    public Person ShallowCopy() => (Person)this.MemberwiseClone();
}

var person1 = new Person("John", 30, new List<string> { "Jane", "Bob", "Alice" });
var person2 = person1.ShallowCopy();
person2.Friends.Remove("Bob");

친구 리스트가 공유되어야 하는 경우, 얕은 복사로 전파되게 하면 좋습니다.

 

정리

  • 깊은 카피는 모든 필드의 개별 복사본으로 새 객체를 생성합니다.
  • 얕은 카피는 원래 객체와 동일한 필드에 대한 참조로 새 객체를 생성합니다.
  • 얕은 복사는 특정 상황에서 유용한 도구가 될 수 있지만 이 복사 전략의 잠재적인 위험과 한계를 인식하는 것이 중요합니다.
  • 복잡한 데이터 구조로 작업할 때는 필요에 따라 적절한 복사 전략을 선택하는 것이 중요합니다.

 

반응형

댓글