티스토리 뷰
======================================================
안녕하세요 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(1, 21); //어떤 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(1, 21); //어떤 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(1, 21); //어떤 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)
'C# > C# 강좌 Winform' 카테고리의 다른 글
Doridori C# 강의) 13.상속(Inheritance) 및 접근제어 (18) | 2018.08.05 |
---|---|
Doridori C# 강의) 12.클래스의 생성 및 사용(Class) (10) | 2018.07.30 |
Doridori C# 강의) 10.반복문2(while, do while) (27) | 2018.07.15 |
Doridori C# 강의) 9.반복문1(for, foreach) (24) | 2018.07.08 |
Doridori C# 강의) 8.조건문(if else, switch) (18) | 2018.07.01 |
- Total
- Today
- Yesterday
- 도리도리 C#
- 나들이
- 모바일
- C#
- 와인
- C# 기초 강의
- 주말
- 위스키
- 가볼만한곳
- 막걸리
- 도리도리
- 전통주
- 보드카
- 아이랑
- 서울
- 술
- 맥주
- 게임
- 증류주
- 프로그램 강의
- C# 강좌
- 칵테일
- 광저우
- 하이볼
- 소주
- Visual Studio
- 가볼만한 곳
- 맛집
- WinForm
- C# 강의
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |