C#

Deep Copy & Shallow Copy

binary는 호남선 2024. 11. 9. 22:45

Deep Copy (깊은 복사) & Shallow Copy (얕은 복사)

  •  ref(참조) 객체를 복사하는 경우(얕은 복사) 두 개의 객체가 하나의 값을 공유하는 현상 발생

[ 깊은 복사 ]

- struct로 선언된 mage는 기본적으로 객체 값 복사하면 deep copy

-  mage2는 mage에서 초기값만 복사하여 가져왔을 뿐 서로 연관 x, 독립적인 객체

 

[ 얕은 복사 ]

-  class로 선언된 knight는 기본적으로 객체 값 복사하면 shallow copy

- knight2는 knight 객체의 또다른 이름이 됨, 같은 변수를 동시에 공유

 

[ 결과 비교 ]

- mage와 knight 모두 복사본을 만들고 그 복사본의 hp를 0으로 변경

- struct인 mage와 mage2는 독립적이므로 mage2의 hp만 변동

- class인 knight는 knight2의 hp가 변하면 함께 변동

 

// 참조 Ref
class Knight
{
    public int hp;
    public int attack;
}
// 복사 Copy
struct Mage
{
    public int hp;
    public int attack;
}
class Program
{
    static void Main(string[] args)
    {
        Mage mage;
        mage.hp = 100;
        mage.attack = 50;

        Mage mage2 = mage;
        mage2.hp = 0;

        // mage
        // hp : 100, attack : 50
        // mage2
        // hp : 0, attack : 50


        Knight knight = new Knight();
        knight.hp = 100;
        knight.attack = 10;

        Knight knight2 = knight;
        knight2.hp = 0;

        // knight
        // hp : 0, attack : 10
        // knight2
        // hp : 0, attack : 10
    }
}

Deep Copy (깊은 복사)로 문제 해결하기

- new 키워드 사용

- 객체를 독립적으로 새로 생성

- 원본을 참조하는 객체 생성 x, 또 다른 원본을 생성

class Knight
{
    public int hp;
    public int attack;
}
class Program
{
    static void Main(string[] args)
    {
        Knight knight = new Knight();
        knight.hp = 100;
        knight.attack = 10;

        Knight knight2 = new Knight();
        knight2.hp = knight.hp;
        knight2.attack = knight.attack;
        // knight의 값만 복사
    }
}

깊은 복사 수행하는 메소드 정의하여 활용

class Knight
{
    public int hp;
    public int attack;

    // 원본의 값만 복사
    public Knight Clone()
    {
        Knight knight = new Knight();
        knight.hp = hp;
        knight.attack = attack;
        return knight;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Knight knight = new Knight();
        knight.hp = 100;
        knight.attack = 10;

        Knight knight2 = knight.Clone();
        knight2.hp = 0;
        // knight2는 knight의 값만 복사
        // 서로 독립적인 객체

        // knight
        // hp : 100, attack : 10
        // knight2
        // hp : 0, attack : 10
    }
}

 

내용 출처 : Inflearn Rookiss님 강의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문

https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part1