티스토리 뷰
======================================================
안녕하세요 Doridori 입니다.
지난번에 프로젝트 마무리에 정신없는 하루를 보내고 있다고 했는데 잘 마무리가 되어 가고 있는 중입니다.
처음 PM으로 프로젝트 시작무터 마무리 까지 진행 해 봤는데 마무리를 하고 나서도 할게 많네요. (역시나 정신 없습니다. ㅋ)
와중에 다른 프로젝트 지원도 가야 해서 역시나 바쁜건 똑같네요 ㅎ
원래 내용 자체는 지난강의보다 더 빨리 준비 해놓았던 내용인데 Copy 관련 내용을 정리하다보니 Copy 이후에 연결해서 준비하기 딱좋은 부분이어서 뒤로 오게 되었습니다.
그래서 지난강의에 빨리 돌아오겠다고 했는데 바쁘다보니 늦었네요..ㅜㅠ
힘들기는 하지만 열심히 지내다 보면 좋은 일이 생기지 않을까 합니다.
모두 화이팅 하십시오!!
======================================================
55.포인터, Memory Address
UI) (기존 소스를 이어서 진행 하기 때문에 지난 강의 Full Souce를 받으시면 됩니다.)
Soruce)
교재)
C 나 C++을 하신 분이라면 포인터라고 아주 지저분한 녀석을 알고 계실텐데 C#에서는 구경도 못한 녀석일거라고 생각 합니다.
요즘에는 크게 사용되지 않는 내용이기는 하지만 이론적으로 접근하면 나름 재미있는 내용이고 뒤에서 동작 하는 부분을 조금 더 고민 해 볼 수 있다는 점에서 좋은 내용이지 않을까 싶어서 준비 해보았습니다.
기존에 진행 했던 부분에서 메모리 번지를 확인 해 볼수 있도록 구성 하였는데 실제로 동작을 해보면 동일한 값인것처럼 보이지만 실제 메모리에는 다른 위치에 할당하고 있는걸 확인 해 볼수있습니다.
address-of 연산자(&), 포인터 간접 참조 연산자(*), fixed, unsafe 등등의 뭔가 생소한 내용들이 많이 나오지만 다 묶어서 사용한다고 생각하시면 될듯 합니다.
뒤에서 메모리를 할당하고 해제하고 하는 부분을 아주 상세히 볼 수 있는 예제는 아니지만 어떤 내용인지 느낌을 받아 보실수 있지 않을까 생각해 봅니다.
강의)
코드 자체는 길지 않은데 간만에 애기하다 텐션이 올라가서 내용이 길어진것 같습니다.
코드를 짜면서 혼자서 이거 잼있네 라는 느낌으로 짜다보니 떠벌떠벌 할말이 많았네요 ㅎㅎ;;
실제 실무에서 많이 사용하지는 않는다는 점이 아쉽지만 나름 만족스러운 예제가 아닌가 싶습니다.
Source)
내용이 길지는 않습니다.
위에서 적은 키워드를 기준으로 검색해 보면 특정 구간이 보일거라고 생각 되네요. ㅎ
ucMemoryAddress)
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
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ShallowCopyAndDeepCopy
{
public partial class ucMemoryAddress : UserControl
{
string _strName = "Name";
string _strAddress = "-";
string _strValue = "-";
public ucMemoryAddress()
{
InitializeComponent();
}
public string StrName { get => _strName; set => lblName.Text = _strName = value; }
public string StrAddress { get => _strAddress; set => lblAddress.Text = _strAddress = value; }
public string StrValue { get => _strValue; set => lblValue.Text = _strValue = value; }
}
}
|
cs |
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
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}";
unsafe
{
#region Origin
// Int
fixed (int* p = &cOrg.iCopy)
{
ucOrg1.StrName = "Int";
ucOrg1.StrAddress = ((long)p).ToString();
ucOrg1.StrValue = (*p).ToString();
}
// Char
fixed (char* p = &cOrg.charCopy)
{
ucOrg2.StrName = "Char";
ucOrg2.StrAddress = ((long)p).ToString();
ucOrg2.StrValue = (*p).ToString();
}
// Array
fixed (int* p = &cOrg.arrCopy[0])
{
ucOrg3.StrName = "Array";
ucOrg3.StrAddress = ((long)p).ToString();
ucOrg3.StrValue = (*p).ToString();
}
// Class
fixed (int* p = &cOrg.clsCopy.iValue)
{
ucOrg4.StrName = "Class";
ucOrg4.StrAddress = ((long)p).ToString();
ucOrg4.StrValue = (*p).ToString();
}
#endregion
#region Copy
// Int
fixed (int* p = &cData.iCopy)
{
ucCopy1.StrName = "Int";
ucCopy1.StrAddress = ((long)p).ToString();
ucCopy1.StrValue = (*p).ToString();
}
// Char
fixed (char* p = &cData.charCopy)
{
ucCopy2.StrName = "Char";
ucCopy2.StrAddress = ((long)p).ToString();
ucCopy2.StrValue = (*p).ToString();
}
// Array
fixed (int* p = &cData.arrCopy[0])
{
ucCopy3.StrName = "Array";
ucCopy3.StrAddress = ((long)p).ToString();
ucCopy3.StrValue = (*p).ToString();
}
// Class
fixed (int* p = &cData.clsCopy.iValue)
{
ucCopy4.StrName = "Class";
ucCopy4.StrAddress = ((long)p).ToString();
ucCopy4.StrValue = (*p).ToString();
}
#endregion
}
}
}
}
|
cs |
'C# > C# 강좌 Winform' 카테고리의 다른 글
Doridori C# 강의 2) 57.콜백(CallBack Method) (2) | 2021.07.18 |
---|---|
Doridori C# 강의 2) 56.인터페이스(Interface) (4) | 2021.06.19 |
Doridori C# 강의 2) 54.얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy) (4) | 2021.04.11 |
Doridori C# 강의 2) 53.Loading 화면 만들기 (Program.cs) (4) | 2021.03.13 |
Doridori C# 강의 2) 52.추상클래스(abstract), 봉인클래스(sealed) (1) | 2021.02.20 |
- Total
- Today
- Yesterday
- 보드카
- 나들이
- 가볼만한 곳
- 위스키
- 아이랑
- 광저우
- C# 강의
- 소주
- 맛집
- 프로그램 강의
- 와인
- 술
- 모바일
- 맥주
- 하이볼
- 서울
- C# 기초 강의
- WinForm
- 가볼만한곳
- C#
- 주말
- 증류주
- 도리도리 C#
- C# 강좌
- 도리도리
- 전통주
- 칵테일
- Visual Studio
- 게임
- 막걸리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |