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
'C# > 개념 공부' 카테고리의 다른 글
[ 내일배움캠프 ] TIL.13 - 인터페이스 ( Interface ) (0) | 2024.05.01 |
---|---|
[ 내일배움캠프 ] TIL.12 - 클래스 ( Class ) (0) | 2024.04.30 |
[ 내일배움캠프 ] TIL.11 - 자료구조 ( 배열 & 리스트 ) (1) | 2024.04.29 |
[ 내일배움캠프 ] TIL.09 - 조건문 & 반복문 (0) | 2024.04.25 |
[ 내일배움캠프 ] TIL.09 - 연산자 (0) | 2024.04.25 |