C#

C# 얕은 복사(Shallow Copy) 깊은 복사(Deep Copy)

근본넘치는개발자 2024. 12. 9. 22:50

오늘은 면접 대비 질문을 준비하면서 잘 모르는 내용이 나와서,  

얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)에 대해 정리해 보고자 합니다.

 

얕은 복사 

객체의 참조 값만 복사하는 방식

 

참조(메모리 주소)만 복사하기에

실제 데이터는 힙 영역의 동일한 메모리를 가리키게 되고,

한쪽에서 내부 값을 변경하면 다른 쪽도 영향을 받는다.

 

예시 

더보기

// 얕은 복사 예시
public class Player
{
    public string Name;
    public List<string> Items;
}

Player player1 = new Player { 
    Name = "원본", 
    Items = new List<string> { "검", "방패" } 
};

// 얕은 복사 수행
Player player2 = player1;

player1.Items.Add("활");  // player2의 Items도 변경됨
Console.WriteLine(player2.Items.Count);  // 3 출력

깊은 복사 

 

객체의 실제 값을 새로운 메모리 공간에 복사하는 방식.

= 생성된 복사본은 원본 객체에 종속적이지 않고 독립적이다.

 

C#에서 참조 형식의 완벽한 깊은 복사는 지원하지 않는다.

=> 참조 형식 데이터 내부에 또 다른 참조 형식 데이터가 있으면

이를 연쇄적으로 추적하여 복제해야 하기 때문.

 

따라서 깊은 복사는 사용자가 직접 구현해야 하는데,

이를 위한 ICloneable 인터페이스가 있다.

 

 

더보기
// 깊은 복사 구현 예시
public class Player : ICloneable
{
    public string Name;
    public List<string> Items;

    public object Clone()
    {
        Player newPlayer = new Player
        {
            Name = this.Name,
            Items = new List<string>(this.Items)  // 새로운 List 생성
        };
        return newPlayer;
    }
}

Player player1 = new Player { 
    Name = "원본", 
    Items = new List<string> { "검", "방패" } 
};

// 깊은 복사 수행
Player player2 = (Player)player1.Clone();

player1.Items.Add("활");  // player2는 영향받지 않음
Console.WriteLine(player2.Items.Count);  // 2 출력

 

더 복잡한 객체의 깊은 복사가 필요한 경우,

직렬화(Serialization)를 사용하거나 재귀적으로 모든 멤버를 복사하는 방법을 주로 사용한다.

 

 

2024.09.30 - [알아보자 시리즈] - 직렬화(Serialization)/ 역직렬화(Deserialization) (feat. JSON, CSV, XML, YAML) 에 대해 알아보자

 

직렬화(Serialization)/ 역직렬화(Deserialization) (feat. JSON, CSV, XML, YAML) 에 대해 알아보자

데이터 저장에 관해 공부하다 보니, 정리의 필요성을 느끼고 이렇게 글을 작성하게 되었습니다.파일들을 자세히 보면 다양한 파일 확장자명을 확인할 수 있었을 것입니다. 이러한 다양한 확장

rootdev.tistory.com

 

 

 

 

2024.09.20 - [C#/기초] - C# - 개념 정리 1 / C# 정의 및 특징 , GC , Dispose, 네임 스페이스, 값 참조 형식, Nullable , 주석 / 면접 질문 대비

 

C# - 개념 정리 1 / C# 정의 및 특징 , GC , Dispose, 네임 스페이스, 값 참조 형식, Nullable , 주석 / 면

오늘은 C# 내용을 정리하는 시간을 가질까 합니다.면접 대비 겸 자료를 찾다 보니 C# 개념들에 대해서도 자세하게 물어보더라고요.몰랐던 내용뿐만 아니라 아는 내용도 확실히 짚고 넘어가고자

rootdev.tistory.com

 

https://learn.microsoft.com/ko-kr/dotnet/api/system.icloneable?view=net-9.0

 

ICloneable 인터페이스 (System)

복제(클래스에서 기존 인스턴스와 같은 값을 갖는 새 인스턴스를 만듦)를 지원합니다.

learn.microsoft.com