Doridori C# 강의 2) 54.얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy)
======================================================
안녕하세요 Doridori 입니다.
지난번에 말씀 드렸는데 자년 9월부터 진행 한 프로젝트가 4월에 마무리되어 마무리 정리로 정신 없는 날을 보내고 있습니다.
짧지 않기도 하고 인원도 많이 투입된 프로젝트이기도 하고 처음으로 맡아서 진행 한 프로젝트이기 때문에 마무리 까지 열심히 달려야 할것 같습니다.
짬짬히 준비 하는게 쉽지 않기는 하지만 열심히 준비 하고 있습니다.
중간중간 치킨값정도 후원해주신다는 분들이 계신데 정말정말 감사 드립니다만 아직 부끄러워서 후원 계좌는 열어두지 않았습니다. ^^;;
여유가 생길 때 커피값정도 받을 수 있는걸 찾아 보고 어디 구석에 살짝 올려볼까 생각 중이긴 합니다.
항상 감사드립니다.
모두 화이팅 하십시오!!
======================================================
54.얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy)
UI)
Soruce)
교재)
예전에 프로젝트를 할때 깊은 복사를 구현해야 할 일이 있어서 알아 봤었는데 구현이 잘 되지 않아 고민을 많이 했었는데 생각해보니 얕은 복사를 구현해 놓고 있었습니다.
얕은 복사와 깊은 복사에 대해 설명하는 블로그들이 내용이 몇가지로 갈리는데 예제를 직접 만들어 보면서 구현해보고 본인이 어떤내용이 맞는지 직접 판단해 보는게 어떨까 싶어서 예제를 만들어 봤습니다.
자바나 자바스크립트 파이썬등 메모리를 자동으로 관리해 주는 언어들에 대해서는 동일한 개념이 따라 올 수 밖에 없기 때문에 한번 보시면 괜찮을 만한 내용 일 듯 합니다.
그림에 주소 영역은 따로 적어 두지 않았기 때문에 약간 헷갈릴 수 있을듯 하긴 한데 다음 강의에 메모리 영역을 표시 하려고 하고 있기 때문에 아껴둔걸로 하겠습니다. ^^;;
별것 아닌 예제인듯 하지만 4번정도를 새로 그리고 코드정리를 하고 한듯 합니다.
개인의 공부를 위해 퍼가시는건 좋으나 똑같은 예제를 내용만 살짝 바꿔서 본인 것처럼 올리지는 말아 주세요.
(짬짬히 고민 할 시간에 틈틈히 정리해서 만들고 있습니다.)
강의)
왠지 코드를 짜는것 보다 말하는데 더 많은 시간이 들어간것 같기는 하지만 잼있는 내용이니 한번 보시면 좋을 듯 합니다.
Source)
cCopySample)
복사 할 Data를 가지고 있는 Class 입니다.
ICloneable Interface, 얕은 복사, 깊은 복사 코드가 구현되어 있는 부분 입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ShallowCopyAndDeepCopy
{
class cCopySample : ICloneable
{
public int iCopy; // 값
public char charCopy; // 값
public int[] arrCopy = new int[5]; // 참조
public cField clsCopy = new cField(); // 참조
// 얕은복사를 위해 생성
public object ShallowCopy()
{
return this.MemberwiseClone();
}
// Deep Copy
public object Clone()
{
cCopySample copy = this.MemberwiseClone() as cCopySample;
// Array
copy.arrCopy = new int[5];
for (int i = 0; i < 5; i++)
{
copy.arrCopy[i] = this.arrCopy[i];
}
// Class
copy.clsCopy = new cField();
copy.clsCopy.iValue = this.clsCopy.iValue;
return copy;
}
}
}
|
cs |
cField)
Class 형태의 Data를 속성으로 가지고 있기 위해서 만들어 놓았습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ShallowCopyAndDeepCopy
{
class cField
{
public int iValue; // 값
}
}
|
cs |
Main Form)
Main 코드 부분 입니다.
위에서 구현 한 부분들을 화면에 보여주는 부분이라고 보면 되겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ShallowCopyAndDeepCopy
{
public partial class Form1 : Form
{
cCopySample cOrg;
public Form1()
{
InitializeComponent();
}
// 원본 데이터
private void btnOrigin_Click(object sender, EventArgs e)
{
cOrg = new cCopySample();
cOrg.iCopy = int.Parse(tboxInt.Text);
cOrg.charCopy = char.Parse(tboxChar.Text);
cOrg.arrCopy = new int[] { int.Parse(tboxIntArray.Text), 0, 0, 0, 0 };
cOrg.clsCopy.iValue = int.Parse(tboxClassNumber.Text);
lblOriginData.Text = $"{cOrg.iCopy}, {cOrg.charCopy}, [{String.Join(",", cOrg.arrCopy)}], {cOrg.clsCopy.iValue}";
}
private void btnCopy_Click(object sender, EventArgs e)
{
if (rdoEqual.Checked)
{
gbox.Text = "a = b";
fEqual();
}
else if (rdoSallowCopy.Checked)
{
gbox.Text = "Shallow Copy";
fShallowCopy();
}
else if (rdoDeepCopy.Checked)
{
gbox.Text = "Deep Copy";
fDeepCopy();
}
}
public void fEqual()
{
cCopySample cOrgRef = cOrg; // 참조
fCopy(cOrgRef);
}
public void fShallowCopy()
{
cCopySample cShallow = (cCopySample)cOrg.ShallowCopy(); // 얕은복사
fCopy(cShallow);
}
public void fDeepCopy()
{
cCopySample cDeep = (cCopySample)cOrg.Clone(); // 깊은복사
fCopy(cDeep);
}
private void fCopy(cCopySample cData)
{
cData.iCopy = int.Parse(tboxInt.Text);
cData.charCopy = char.Parse(tboxChar.Text);
cData.arrCopy[0] = int.Parse(tboxIntArray.Text);
cData.clsCopy.iValue = int.Parse(tboxClassNumber.Text);
lblCopyData.Text = $"{cData.iCopy}, {cData.charCopy}, [{String.Join(",", cData.arrCopy)}], {cData.clsCopy.iValue}";
// 변경 후 Org Data
lblOrgData.Text = $"{cOrg.iCopy}, {cOrg.charCopy}, [{String.Join(",", cOrg.arrCopy)}], {cOrg.clsCopy.iValue}";
}
}
}
|
cs |