Pink Transparent Star

C#/개념 공부

[ 내일배움캠프 ] TIL.13 - 얕은 복사 & 깊은 복사

채유나 2024. 5. 1. 20:40
728x90

 

얕은 복사와 깊은 복사에 대해 알기전에 값 타입과 참조 타입에 알아둬야해서 간략하게 작성한 뒤 얕은 복사, 깊은 복사에 대해 작성하려고 한다.

값 타입 ( Value Type ) 🔗 참조 타입 ( Reference Type ) 🔗
각각의 고유의 메모리를 소유 생성된 인스턴스들은 주소값을 공유
데이터를 직접적으로 스택 메모리에 저장 스택 메모리에는 힙 메모리의 주소 저장
힙 메모리에는 데이터를 저장
byte, short, int, ... decimal, bool, enum, struct class, interface, delegate, dynamic, object, string

 

🔷 얕은 복사 ( Shallow Copy ) :

참조 형식의 데이터를 복사하는 것으로 참조를 복사하는 것을 의미한다. 

◾ 이때 복사된 객체를 수정하면 원본 객체의 데이터도 수정된다.

public class Monster
{
    public string Name;
    public int hp;
    public Monster(string _name, int _hp)
    {
        Name = _name;
        hp = _hp;
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Monster monster1 = new Monster("미니언", 100);
        monster1.hp = 20;
        Monster monster2 = monster1;
        monster2.Name = "대포미니언";
        monster2.hp = 40;

        Console.WriteLine($"monster1 Name : {monster1.Name}, HP : {monster1.hp}");
        Console.WriteLine($"monster2 Name : {monster2.Name}, HP : {monster2.hp}");


    }
}

 

해당 예시 코드와 같이 객체의 참조만 복사하기 때문에 동일한 힙 메모리 주소를 가르키게 되고 복사한 객체의 값을 변경하게 되면 이전 객체의 값이 변경되는 걸 확인 할 수 있습니다.

 

즉, 제대로된 복사를 해주기위해선 새로운 객체를 생성하고 내부 값들을 복사하여 넘겨주는 깊은 복사 작업이 필요하다.

 

🔷 깊은 복사 ( Deep Copy ) :

값 형식의 데이터를 복사하는 것으로 데이터의 값 전체를 복사하는 것을 의미한다.

◾ 객체의 독립적인 복사본을 만들 때 사용한다.

 

    public class Monster
    {
        public string Name;
        public int hp;
        public Monster(string _name, int _hp)
        {
            Name = _name;
            hp = _hp;
        }

        public Monster DeepCopy()
        {
            Monster newMonster = new Monster("", 0);
            newMonster.Name = this.Name;
            newMonster.hp = this.hp;

            return newMonster;
;        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            Monster monster1 = new Monster("미니언", 100);
            monster1.hp = 20;
            Monster monster2 = monster1.DeepCopy();
            monster2.Name = "대포미니언";
            monster2.hp = 40;

            Console.WriteLine($"monster1 Name : {monster1.Name}, HP : {monster1.hp}");
            Console.WriteLine($"monster2 Name : {monster2.Name}, HP : {monster2.hp}");


        }
    }

 

얕은 복사에서 이용한 코드를 이용하여 DeepCopy() 메서드를 만들었다. DeepCopy()는 새로운 객체를 만들어서 내부 값들을 복사해주고 리턴하는 메서드으로 monster1과 moster2는 서로 다른 객체를 참조하고 있는 것을 알 수 있다.

728x90