C# 얕은 복사, 깊은 복사

김민구·2024년 11월 15일
0

C#

목록 보기
6/31

모든 데이터 타입은 값 타입(value type) 또는 참조 타입(reference type)을 가진다.

  • 값 타입(Value type) : 각각의 고유의 메모리를 소유한다.

  • 참조 타입(Reference type) : 생성된 인스턴스들은 주소값을 공유한다.

  • 얕은 복사(Shallow copy)란?
    ㄴ 값 자체를 복사하는 것이 아니라 주소값을 복샇여 같은 메모리를 가르킨다.
    ㄴ 깊은 복사에 비해 상대적으로 빠르다.
    ㄴ 그로 인해 아래와 같이 값을 바꿔주면 같은 결과를 출력한다.

        //얕은 복사
        string[] arr1 = new string[] { "test1", "test2" };
        string[] arr2 = arr1;

        Console.WriteLine("배열1 {0}, {1}", arr1[0], arr1[1]);
        Console.WriteLine("배열2 {0}, {1}", arr2[0], arr2[1]);

        arr1[0] = "test3";

        Console.WriteLine("배열1 {0}, {1}", arr1[0], arr1[1]);
        Console.WriteLine("배열2 {0}, {1}", arr2[0], arr2[1]);

배열1 test1, test2
배열2 test1, test2
배열1 test3, test2
배열2 test3, test2

  • 깊은 복사(Deep copy)란?
    ㄴ 데이터 자체를 통째로 복사한다.
    ㄴ 복사된 두 객체는 완전히 독립적인 메모리를 차지한다.
    ㄴ value type의 객체들은 깊은 복사를 하게 된다.
    ㄴ 그로 인해 아래와 같이 값을 변경하여도 arr1에 값만 변경된다.
        string[] arr1 = new string[] { "test1", "test2" };
        string[] arr2 = new string[2];
        Array.Copy(arr1, arr2, 2);

        Console.WriteLine("배열1 {0}, {1}", arr1[0], arr1[1]);
        Console.WriteLine("배열2 {0}, {1}", arr2[0], arr2[1]);

        arr1[0] = "test3";

        Console.WriteLine("배열1 {0}, {1}", arr1[0], arr1[1]);
        Console.WriteLine("배열2 {0}, {1}", arr2[0], arr2[1]);

배열1 test1, test2
배열2 test1, test2
배열1 test3, test2
배열2 test1, test2

  • 깊은 복사를 이용해야 하는 이유
    ㄴ 위 코드와 같이 원본 개체만 변화해야 하거나 복사된 개체만 변화해야 하는 경우 깊은 복사를 사용해야하며
    ㄴ 게임으로 예를들면 같은 전사라는 캐릭터를 A, B 생성했을때 플레이 하는 사람이 다르므로 얼마나 성장시켰는지 다를 것이므로 다른 능력수치를 가진 캐릭터가 될 것이기 때문에 깊은 복사로 캐릭터가 생성되어야 한다.
profile
C#, Unity

0개의 댓글