오늘은 면접 대비 질문을 준비하면서 잘 모르는 내용이 나와서,
얕은 복사(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)를 사용하거나 재귀적으로 모든 멤버를 복사하는 방법을 주로 사용한다.
직렬화(Serialization)/ 역직렬화(Deserialization) (feat. JSON, CSV, XML, YAML) 에 대해 알아보자
데이터 저장에 관해 공부하다 보니, 정리의 필요성을 느끼고 이렇게 글을 작성하게 되었습니다.파일들을 자세히 보면 다양한 파일 확장자명을 확인할 수 있었을 것입니다. 이러한 다양한 확장
rootdev.tistory.com
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
'C#' 카테고리의 다른 글
c# - reflection과 Attribute에 대해 알아보자 (0) | 2024.10.23 |
---|---|
2024 내일 배움캠프(Unity_6기) _ 사전캠프 7일차(08.21) : String 과 StringBuilder에 대해 알아보자 (0) | 2024.08.21 |
2024 내일 배움캠프(Unity_6기) _ 사전캠프 6일차(08.20) : C# 문자열 보간 에 대해 알아보자 (0) | 2024.08.20 |
2024 내일 배움캠프(Unity_6기) _ 사전캠프 5일차(08.19) - Random에 대해 알아보자 (0) | 2024.08.19 |
2024 내일 배움캠프(Unity_6기) _ 사전캠프 4일차(08.16) - C# 문법 기초 : Convert, Parse, TryParse (0) | 2024.08.16 |