S_pot

210525 C#_얕은복사(Shallow), 깊은복사(Deep) 본문

C#

210525 C#_얕은복사(Shallow), 깊은복사(Deep)

S_pot 2021. 5. 25. 09:35
using System;
// 얕은복사, 깊은복사 예제

namespace _210525_001
{
    class MyClass
    {
        public int MyField1;  // 인스턴스 변수
        public int MyField2;  // 인스턴스 변수

        public MyClass DeepCopy()  // 반환값: MyClass 래퍼런스
        {
            MyClass newCopy = new MyClass();  // 새로운 MyClass를 생성 
            newCopy.MyField1 = this.MyField1; // this는 source.MyField1
            newCopy.MyField2 = this.MyField2; // this는 source.MyField2

            return newCopy;     
        }       
        ~MyClass()
        {
            Console.WriteLine("소멸자 호출");
        }
    }
    class MainApp
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Shallow Copy");

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

                MyClass target = source;
                target.MyField2 = 30;

                Console.WriteLine($"{source.MyField1} {source.MyField2}");
                Console.WriteLine($"{target.MyField1} {target.MyField2}");
            } // source, target 스택에서 삭제, MyClass 객체도 삭제

            Console.WriteLine("Deep Copy");
            {
                MyClass source = new MyClass();
                source.MyField1 = 10;
                source.MyField2 = 20;

                MyClass target = source.DeepCopy(); // 17번줄의 return값이 된다. MyField1 = 10, MyField2 = 20
                target.MyField2 = 30;

                Console.WriteLine($"{source.MyField1} {source.MyField2}");
                Console.WriteLine($"{target.MyField1} {target.MyField2}");
            }
        }
    }
}

 

출력값