본문 바로가기
유니티

Day 18 - C# (얇은 복사, 깊은 복사, ICloneable)

by shin0707 2024. 5. 3.
728x90

  • 주제

>>객체 얇은 복사(Shallow Copy)와 깊은 복사(Deep Copy)

>>ICloneable(깊은 복사를 위한 인터페이스)


  • 공부내용

1.객체 얇은 복사

객체의 참조만 복사하는 것이다. (객체의 위치 값을 복사)

한마디로 복사가 일어나도 실제로 객체는 2개가 아닌 하나로, 원본과 얇은 복사로 생성된 것은

결국 같은 값을 출력한다.

그래서 얇은 복사로 복사된 값이 바뀌면, 원본의 값도 같이 바뀐다. 

 

***참조형이란?

2024.05.01 - [유니티] - Day 16 - C# (참조형, 박싱, 람다, 델리게이트)

public class Employee
{
    public int No;
    public string Name;
}

public class Program
{
    static void Main(string[] args)
    {
        Employee source = new Employee();
        source.No = 1;
        source.Name = "Sana";

        Employee target = source;
        target.No = 2;
        target.Name = "SSABI";

        Console.WriteLine(source.No + ", " + source.Name);
        Console.WriteLine(target.No + ", " + target.Name);
    }
}

[출력]
2, SSABI
2, SSABI

<출처>https://ssabi.tistory.com/28

 

**게임 캐릭터의 속성을 얇은 복사로 가져오면, 전투로 인해 속성 값이 변했을 때

기본 속성 값도 같이 변하기 때문에, "캐릭터의 기존 체력 -> 데미지를 받고 줄어든 체력"을

나타낼 수 없다. 

==> 구현하기 위해서는 깊은 복사를 사용해야 한다.


2. 깊은 복사

객체를 복사해서 새로운 객체를 만드는 것이다.

원본과 복사본의 서로 다른 참조값을 가지게 된다.

깊은 복사는 사용자가 직접 구현해야 한다. (클래스 내에 깊은 복사를 할 메서드를 구현)

public class Employee
{
    public int No;
    public string Name;

    public Employee DeepCopy()
    {
        Employee employee = new Employee();
        employee.No = No;
        employee.Name = Name;

        return employee;
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Employee source = new Employee();
        source.No = 1;
        source.Name = "Sana";

        Employee target = source.DeepCopy();
        target.No = 2;
        target.Name = "SSABI";

        Console.WriteLine(source.No + ", " + source.Name);
        Console.WriteLine(target.No + ", " + target.Name);
    }
}

[출력]
1, Sana
2, SSABI

<출처>https://ssabi.tistory.com/28

**복사본의 값이 달라져도 원본 값은 변하지 않는다.

 

3. ICloneable 인터페이스

ICloneable 인터페이스를 사용하면 클래스에 ICloneable을 상속하여 깊은 복사를 구현할 수 있다.

public class Employee : ICloneable
{
    public int No;
    public string Name;

    public object Clone()
    {
        Employee employee = new Employee();
        employee.No = No;
        employee.Name = Name;

        return employee;
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Employee source = new Employee();
        source.No = 1;
        source.Name = "Sana";

        Employee target = (Employee)source.Clone();
        target.No = 2;
        target.Name = "SSABI";

        Console.WriteLine(source.No + ", " + source.Name);
        Console.WriteLine(target.No + ", " + target.Name);
    }
}

<출처>https://ssabi.tistory.com/28

 

728x90
반응형