순서
I. Deep / Shallow Copy
II. Deep / Shallow Copy Example
(C#제공 문법 활용 Example)
I. Deep / Shallow Copy
데이터의 저장이란 기본적으로 시스템의 내부 주소(메모리공간)에
해당 데이터를 넣어두는 것이고, 변수는 그 주소를 바라보고 있다.
그렇다면 이 저장된 데이터를 다른 변수에 복사하는 것은 두가지 의미를 가진다.
1. 말 그대로 Copy이다 하나를 똑같이 새롭게 복사하는 것이다.
-> 참조된 객체 자체를 복사하는 우리가 생각하는 복사 (Deep Copy)
2. 데이터만 복사하기 위해서 그냥 같은 메모리 공간을 바라보고 있다.
-> 같은 공간을 바라보기에 데이터의 변경이 일어나면 간섭이 발생한다. (Shallow Copy)
즉, Deep Copy는 내부에 참조된 객체 전체를 새롭게 복사해주고
Shallow Copy는 복사 해주는 척 동일한 객체를 같이 참조하는 것이다.
II. Deep / Shallow Copy Example
C#에서는
깊은복사 : IClonable 인터페이스를,
얕은복사 : Object Class의 MemberwiseClone 인터페이스를 이용하여 구현한다.
C++처럼 주소를, 값을 복사하며 고민 할 필요가 없어진다.
1. Deep Copy Example
using System;
namespace DeepCopyApp {
class CCard {
public string name {
get; set;
}
}
// ICloneable Interface사용
class CUser : ICloneable {
public int age;
public CCard card;
public object Clone() { // 구현해야한다.
CUser copyuser = new CUser();
copyuser.age = this.age;
copyuser.card = new CCard();
copyuser.card.name = this.card.name;
return copyuser;
}
}
public class CMain {
static void Main() {
CUser user1 = new CUser();
user1.age = 20;
user1.card = new CCard();
user1.card.name = "user1BC";
CUser user2 = user1.Clone();
user2.card.name = "user2BC"
Console.WriteLine($"{user1.card.name}");
Console.WriteLine($"{user2.card.name}");
}
}
}
출력
user1BC
user2BC
당연히 흔히 하는 생각대로 복사되서 서로 다른 값을 가지고 있다.
2. Shallow Copy
using System;
namespace DeepCopyApp {
class CCard {
public string name {
get; set;
}
}
// ICloneable Interface사용
class CUser {
public int age;
public CCard card;
// MemberwiseClone 사용
public object Clone() {
return this.MemberwiseClone();
}
}
public class CMain {
static void Main() {
CUser user1 = new CUser();
user1.age = 20;
user1.card = new CCard();
user1.card.name = "user1BC";
CUser user2 = user1.Clone();
user2.card.name = "user2BC"
Console.WriteLine($"{user1.card.name}");
Console.WriteLine($"{user2.card.name}");
}
}
}
출력
user2BC
user2BC
MemberwiseClone()을 사용하여 그저 객체 참조만 넘겨주어
user2의 변경점이 원래 user1에서도 변경이 된다. 즉, 같은 주소를 바라보고 있다.
함수에 인자를 넘겨줄 때 Call by Reference로 인자를 넘겨주는 것과 비슷한 진행방식이다.
'Programming > C#' 카테고리의 다른 글
[Programming][C#] 문법 8. 한정자 (virtual, override, sealed, new) (0) | 2023.01.09 |
---|---|
[Programming][C#] 문법 7. Partial Class / Method (0) | 2023.01.09 |
[Programming][C#] 문법 5. Struct (0) | 2023.01.09 |
[Programming][C#] 문법 4. Polymorphism with Inheritance & Override (0) | 2023.01.08 |