티스토리 뷰

======================================================

안녕하세요 Doridori 입니다. 


이번강의는 구조체와 클래스(Struct, Class)에 대해서 강의 하도록 하겠습니다. 


구조체와 클래스의 경우는 눈에 띄는 기능이 있는것이 아니어서(외적으로) 이론적으로 접근해야 해서 어려운것 같습니다. 


먼저 구조체를 기준으로 예제를 구현해 보았는데 도움이 되셨으면 좋겠습니다.

======================================================


구조체와 클래스(Struct, Class)


Source UI) Study_11_Struct_Class(UI).zip

Soruce 전체) Study_11_Struct_Class.zip

교재) 11강 구조체와 클래스(Struct, Class).pdf

※ Image의 경우 Source안에 "00.해 달 별 image" Folder에 넣어 두었습니다. ^^



이번에 강의 할 구조체와 클래스의 경우 거의 비슷한기능을 가지고 있어서 사용법에 대한 논란도 많이 나오는 기능들입니다. 


보통은 단순 Data 처리를 구조체를 사용하고 메소드별로 처리해야 할 기능이 많으 때 클래스를 사용 하는데 


단순하게 나누기에는 논란의 성능을 가지고 있는것 같습니다. 


(구글에서 구조체와 클래스의 차이로 검색 해보시면 많은 이야기 들이 있는데 대부분의 상황에서는 개발자의 취향 차이 같습니다.)


구조체의 경우 Data 형이 여러가지가 섞여있는 Type이 필요 할 경우 정해서 사용한다 라고 생각 해두시면 될것 같습니다.

(예제에서 Player가 가지고 있어야 하는 정보 관점에서 보시면 이해 하시는데 도움이 될것 같습니다.)





이번 UI에서는 PictureBox와 RadioButton을 사용해 보았습니다. 


UI의 꽃이라고 할 수있는 Image로 UI를 꾸미는 Control이고 선택을 위해서 많이 사용 되는 RadioButton의 경우 많이 사용 되는 Control입니다. 



(UI에 ListBox를 TextBox로 사용해서 수정 하였습니다. ^^)



이번에는 기존에 사용했던 기능들을 조금더 사용해서 (Source가 진행 되는 방향을 보시면 좋을 것 같습니다.) 


Player 두명이 해,달,별 카드를 가지고 합계 대결을 하는 단순한 게임을 만들어 보았습니다. 


게임을 한다고 생각하고 해보시면 조금더 재미있게 짜볼수 있지 않을까 합니다.


Source)


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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
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 _11.Struct_Class
{
 
    public partial class Form1 : Form
    {
        // Player에 대한 구조체
        struct structPlayer
        {
            public int iCount;  // Player가 몇회 진행 중인지
 
            public int iSun;  // 해에 대한 값
            public int iMoon;  // 달에 대한 값
            public int iStar;  // 별에 대한 값
 
            public int iCardSum;  // 해, 달, 별을 더한 값
 
            // 값들을 더해서 반환
            public int CardSun(int iSum, int iMoon, int iStar)
            {
                return iSun + iMoon + iStar;
            }
 
            // 결과를 String 형태로 변환 (화면에 결과를 보여주기 위해 사용)
            public string ResultText()
            {
                return string.Format("{0}회) 해:{1}, 달:{2}, 별:{3} => 합계는 {4} 입니다.", iCount, iSun, iMoon, iStar, iCardSum);
            }
        }
 
 
        // Player에 대한 Class (실제 프로그램 동작과는 관계 없음)
        class classPlayer
        {
            public int iCount = 0;  // Player가 몇회 진행 중인지
 
            public int iSun = 2;  // 해에 대한 값
            public int iMoon = 3;  // 달에 대한 값
            public int iStar = 3;  // 별에 대한 값
 
            public int iCardSum = 4;  // 해, 달, 별을 더한 값
 
            // 값들을 더해서 반환
            public int CardSun(int iSum, int iMoon, int iStar)
            {
                return iSun + iMoon + iStar;
            }
 
            // 결과를 String 형태로 변환 (화면에 결과를 보여주기 위해 사용)
            public string ResultText()
            {
                return string.Format("{0}회) 해:{1}, 달:{2}, 별:{3} => 합계는 {4} 입니다.", iCount, iSun, iMoon, iStar, iCardSum);
            }
        }
 
        structPlayer _stPlayer1;  //1번 Player
        structPlayer _stPlayer2;  //2번 Player
 
        Random _rd = new Random();  // 난수 발생용
 
        classPlayer _clPlayer1 = new classPlayer();  //Test 용 
        classPlayer _clPlayer2 = new classPlayer();  //Test 용 
 
 
        /// <summary>
        /// 프로그램의 진입점 입니다.
        /// </summary>
        public Form1()
        {
            InitializeComponent();
        }
 
 
        /// <summary>
        /// 화면에서 "해" 그림을 Click 했을 때 Event를 발생 시킵니다.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pboxSun_Click(object sender, EventArgs e)
        {
            int iNumber = _rd.Next(121);
 
            //어떤 Player가 선택 되어 있는지 확인
            if (rdoPlayer1.Checked)
            {
                _stPlayer1.iSun = iNumber;
 
                //_clPlayer1.iSun = iNumber;
            }
            else
            {
                _stPlayer2.iSun = iNumber;
 
                //_clPlayer2.iSun = iNumber;
            }
 
            Result();
        }
 
 
        /// <summary>
        /// 화면에서 "달" 그림을 Click 했을 때 Event를 발생 시킵니다.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pboxMoon_Click(object sender, EventArgs e)
        {
            int iNumber = _rd.Next(121);
 
            //어떤 Player가 선택 되어 있는지 확인
            if (rdoPlayer1.Checked)
            {
                _stPlayer1.iMoon =iNumber;
            }
            else
            {
                _stPlayer2.iMoon = iNumber;
            }
 
            Result();
        }
 
 
        /// <summary>
        /// 화면에서 "별" 그림을 Click 했을 때 Event를 발생 시킵니다.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pboxStar_Click(object sender, EventArgs e)
        {
            int iNumber = _rd.Next(121);
 
            //어떤 Player가 선택 되어 있는지 확인
            if (rdoPlayer1.Checked)
            {
                _stPlayer1.iStar =iNumber;
            }
            else
            {
                _stPlayer2.iStar = iNumber;
            }
 
            Result();
        }
 
 
        /// <summary>
        /// 화면에서 "빈" 그림을 Click 했을 때 Event를 발생 시킵니다.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pboxNone_Click(object sender, EventArgs e)
        {
            // 아무짓도 안하고 한턴을 넘긴다
 
            Result();
        }
 
        
        /// <summary>
        /// 현재 선택 된 Radio Button을 확인해서 선택되지 않은 Radio Button을 선택하기 위해 사용
        /// </summary>
        private void iCheckedChange()
        {
            //어떤 Player가 선택 되어 있는지 확인
            if (rdoPlayer1.Checked)
            {
                rdoPlayer2.Checked = true;
            }
            else
            {
                rdoPlayer1.Checked = true;
            }
        }
 
 
        /// <summary>
        /// 선택 된 Radio Button에 대해서 해, 달, 별의 값을 더하고 결과를 내용으로 만들어서 ListBox에 표시
        /// </summary>
        private void Result()
        {
            string strResult = string.Empty;
 
            //어떤 Player가 선택 되어 있는지 확인
            if (rdoPlayer1.Checked)  
            {
                _stPlayer1.iCount++;  // Player에 대한 진행 횟수를 증가
 
                _stPlayer1.iCardSum = _stPlayer1.CardSun(_stPlayer1.iSun, _stPlayer1.iMoon, _stPlayer1.iStar);  // 해, 달, 별의 값을 더해서 Player에 ICradSum에 넣어줌
 
                strResult = _stPlayer1.ResultText();  // 결과 값을 string 형태로 변환
 
                lboxResult1.Items.Add(strResult);  // 결과 값을 listbox에 등록
            }
            else
            {
                _stPlayer2.iCount++;
 
                _stPlayer2.iCardSum = _stPlayer2.CardSun(_stPlayer2.iSun, _stPlayer2.iMoon, _stPlayer2.iStar);
 
                strResult = _stPlayer2.ResultText();
 
                lboxResult2.Items.Add(strResult);
            }
 
            iCheckedChange();  // 다음 Player 선택
 
            // 결과를 체크 (Player1과 2의 진행 횟수가 5회가 넘어갈 경우 각 Player의 iCard Sum 값을 비교해서 결과를 화면에 Popup 합니다.
            if (_stPlayer1.iCount >= 5 && _stPlayer2.iCount >= 5)
            {
                if (_stPlayer1.iCardSum > _stPlayer2.iCardSum)
                {
                    MessageBox.Show("Player1이 이겼습니다.");
                }
                else if (_stPlayer1.iCardSum < _stPlayer2.iCardSum)
                {
                    MessageBox.Show("Player2가 이겼습니다.");
                }
                else
                {
                    MessageBox.Show("비겼습니다.");
                }
            }
        }
    }
}
 
cs




이번강의의 경우 내용이 길어져서 2강의로 분리 하였습니다.


(UI작성까지 완료하고 시간을 보았는데 20분이 넘어가서 분리하였습니다. Source 부분도 30분정도의 강의입니다.)


앞쪽에 UI들어가기 전까지는 내용 설명이니 UI를 Skip 하실 분은 내용은 보고 Skip 하시면 될것 같습니다. 


강의 1)



강의2)



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함