티스토리 뷰

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

안녕하세요 Doridori 입니다. 


이번강의는 Class에 대해서 강의 하도록 하겠습니다. 


※ 주의 : 이번 강의는 이론이 주가 되며 코드들을 이런 저런 식으로 수정 하는 부분이 많아 집중이 힘들 수 있습니다. 


Class에 대한 강의로 Class와 관계있는 이론 부분이 있습니다. (신입 이론 확인 용 면접관련 질문으로 좋습니다.~!)


이번 강의 내용은 클래스를 생성해서 사용하는 부분이기는 하지만 가장 하고 싶었던 애기는 코드에서 정답을 찾지 않길 원합니다. 


(클래스를 배우게 되면 동일한 결과를 내는 코드를 짜는 방법이 매우 다양해 지게 됩니다.)


정답에 맞춰서 짜기 시작하는 코드를 만들면 막혔을 경우 포기하게되는 경우가 많기 때문에 이런 저런식으로 생각해서 코드를 작성 해 보시 기를 권합니다.

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


Class의 생성과 사용


Source UI) (이번강의 UI는 저번 강의 때 사용된 내용을 기준으로 추가 하여 별도로 파일을 구성하지 않았습니다.)

Soruce 전체) Study_12_Class_1.zip

교재) 12강 클래스의 생성 및 사용(Class).pdf



클래스의 경우 객체지향 언어인 C#의 핵심이라고 볼수 있습니다. 


이에 애기 할것도 많고 파생되는 기능들도 많은데 우선은 가장 기본적으로 클래스를 생성하는 방법과 생성하고 어떤식으로 사용하게 되는지에 대해서 이야기 해보려고 합니다. 


강의를 만들려고 준비하면서 가장 많은 고민이 되었던 부분이 해야될 이야기가 많다 보니 어떤순서로 이야기를 해야 한하는지? 

그리고 설명을 하면서 여기저기 왔다갔다 해야 해서 집중이 안되면 어쩌지? 라는 고민을 많이 했는데 

이번강의에서 가져가실 부분은 클래스를 만드는 부분과 네임스페이스가 맞지않을 경우 호출 하는 방법, 생성자 정도만 확인 하시면 될것 같습니다. 


그리고 가장 중요한 내용이 코드에서 정답을 찾으려고 하지 않는 점 입니다. 

(서술형이라고 하면 답이 될수도 있겠네요 ^^;;)


꼭 똑같이 짜지 않더라도 나는 이게 더 나아 보이는데 라고 하는 부분이 있으면 생각대로 짜시면 됩니다. 


일단 다 작성해 보시고 이후에 효율에 대해서, 아니면 확장성에 대해서 비교를 하면서 고민을 해보시면 될것 같습니다. 

위의 내용들에 대해서 간단한 정리 내용 정도를 첨부 하였습니다. 

보통 전문 서적 같은것을 보면 뒤쪽에 단어 정리 해놓은 부분같은 느낌으로 보시면 될것 같습니다. 

(상세 내용은 검색해서 보셔도 좋고 추가로 강의를 추가 할 예정입니다.)


UI)

지난 Struct 강의에서 하단 상황판 부분만 추가 하였습니다. (UI 그리는 시간이 매우 짧았는데도 강의가 길어지네요;;)




소스 Code 및 내용)

[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
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
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;
 
using CPL = _12_Class;
 
namespace _11.Struct_Class
{
 
    public partial class Form1 : Form
    {
        // Player에 대한 구조체(구조체의 경우 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);
            //}
        }
 
        Random _rd = new Random();  // 난수 발생용
 
        structPlayer _sp1;  //Player1 생성
        structPlayer _sp2;  //Player2 생성
 
        CPL.CPlayer _clPlayer = new CPL.CPlayer();  // 수식 및 결과 계산을 위한 Player Class 생성
        
        //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)
            {
                //_clPlayer1.iSun = iNumber;
                _sp1.iSun = iNumber;   // 구조체가 선택 된 Card의 값을 넣어 줌 (이하 같은 항목의 경우도 동일)
 
            }
            else
            {
                //_clPlayer2.iSun = iNumber;
                _sp2.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)
            {
                _sp1.iMoon = iNumber;
            }
            else
            {
                _sp2.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)
            {
                _sp1.iStar = iNumber;
            }
            else
            {
                _sp2.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;   // 선택 되어 있지 않은 Player를 선택 하도록 함
            }
            else
            {
                rdoPlayer1.Checked = true;
            }
        }
 
 
        /// <summary>
        /// 선택 된 Radio Button에 대해서 해, 달, 별의 값을 더하고 결과를 내용으로 만들어서 ListBox에 표시
        /// </summary>
        private void Result()
        {
            string strResult = string.Empty;
 
            //어떤 Player가 선택 되어 있는지 확인
            if (rdoPlayer1.Checked)
            {
                _sp1.iCount++;  // Player에 대한 진행 횟수를 증가
 
                _sp1.iCardSum = _clPlayer.CardSun(_sp1.iSun, _sp1.iMoon, _sp1.iStar);  // Player Class에서 해, 달, 별의 값을 더하는 함수를 호출, 계산 후 결과를 Player 1 CardSum에 넣어 줌
 
                strResult = _clPlayer.ResultText(_sp1.iCount, _sp1.iSun, _sp1.iMoon, _sp1.iStar, _sp1.iCardSum);  // Player Class에서 결과 값을 string 형태로 변환하는 함수를 호출
 
                lboxResult1.Items.Add(strResult);  // 결과 값을 listbox에 등록
            }
            else
            {
                _sp2.iCount++;
 
                _sp2.iCardSum = _clPlayer.CardSun(_sp2.iSun, _sp2.iMoon, _sp2.iStar);
 
                strResult = _clPlayer.ResultText(_sp2.iCount, _sp2.iSun, _sp2.iMoon, _sp2.iStar, _sp2.iCardSum);
 
                lboxResult2.Items.Add(strResult);
            }
 
            iCheckedChange();  // 다음 Player 선택
 
            // 결과를 체크 Player1과 Player2의 진행 횟수가 같을 경우 ( => 게임의 한턴이 진행 되었을 경우)
            if (_sp1.iCount == _sp2.iCount)
            {
                lboxNow.Items.Add(_clPlayer.PlayerPair(_sp2.iCount, _sp1.iCardSum, _sp2.iCardSum));   // Player Class에서 두 Player의 Card 합을 비교하는 함수를 호출 후 결과를 List Box에 넣어 줌
                
                if (_sp2.iCount >= 5)   // 게임 횟수가 5턴이 마무리 되었을 경우 ( => 위에서 Player 1과 Player 2의 횟수가 같을 경우만 체크 함으로 Player1의 횟수나 2의 횟수 중 아무 횟수나 확인 해도 상관 없음)
                {
                    lboxNow.Items.Add(_clPlayer.PlayerResult(_sp1.iCardSum, _sp2.iCardSum));  // Player Class에서 게임 결과를 가져오는 함수를 호출 후 List Box에 넣어줌
                }
            }
        }
    }
}
 
cs


[Player Class]

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _12_Class
{
    /// <summary>
    /// (기존 Struct 에서 Class로 변경 (생성자와 소멸자만 추가))
    /// Player에 대한 Class (실제 프로그램 동작과는 관계 없음)
    /// </summary>
    class CPlayer
    {
        //public int iCount = 0;  // Player가 몇회 진행 중인지
 
        //public int iSun = 0;  // 해에 대한 값
        //public int iMoon = 0;  // 달에 대한 값
        //public int iStar = 0;  // 별에 대한 값
 
        //public int iCardSum = 0;  // 해, 달, 별을 더한 값
 
        /// <summary>
        /// 생성자 - 클래스를 생성 할 때 호출
        /// </summary>
        public CPlayer()
        {
            Console.WriteLine("생성자 생성 표시");
        }
 
        
        /// <summary>
        /// 소멸자 - 클래스가 소멸 될때 호출
        /// </summary>
        ~CPlayer()
        {
            Console.WriteLine("프로그램 소멸 표시");
        }
 
 
        /// <summary>
        /// 인자 값들을 더해서 반환
        /// </summary>
        /// <param name="iSun"></param>
        /// <param name="iMoon"></param>
        /// <param name="iStar"></param>
        /// <returns></returns>
        public int CardSun(int iSun, int iMoon, int iStar)
        {
            return iSun + iMoon + iStar;
        }
 
 
        /// <summary>
        /// Player의 결과를 String 형태로 변환 (화면에 결과를 보여주기 위해 사용)
        /// </summary>
        /// <param name="iCount"></param>
        /// <param name="iSun"></param>
        /// <param name="iMoon"></param>
        /// <param name="iStar"></param>
        /// <param name="iCardSum"></param>
        /// <returns></returns>
        public string ResultText(int iCount, int iSun, int iMoon, int iStar, int iCardSum)
        {
            return string.Format("{0}회) 해:{1}, 달:{2}, 별:{3} => 합계는 {4} 입니다.", iCount, iSun, iMoon, iStar, iCardSum);
        }
 
 
        /// <summary>
        /// 두 Player의 Card 합을 비교 후 결과를 반환
        /// </summary>
        /// <param name="iCount"></param>
        /// <param name="iP1CardSum"></param>
        /// <param name="iP2CardSum"></param>
        /// <returns></returns>
        public string PlayerPair(int iCount, int iP1CardSum, int iP2CardSum)
        {
            int iCheck = iP1CardSum - iP2CardSum;
 
            if (iCheck > 0)
            {
                return string.Format("{0}회차 : Player1이 {1} 만큼 더 큽니다.", iCount, iCheck);
            }
            else if (iCheck < 0)
            {
                return string.Format("{0}회차 : Player2가 {1} 만큼 더 큽니다.", iCount, Math.Abs(iCheck));   // 음수를 양수로 변환 하기 위해서 절대 값을 사용하거나 -1을 곱함
                //return string.Format("{0}회차 : Player2가 {1} 만큼 더 큽니다.", iCount, iCheck * -1);
            }
            else
            {
                return string.Format("{0}회차 : 둘의 값이 같습니다.", iCount);
            }
        }
 
 
        /// <summary>
        /// 게임의 결과를 반환
        /// </summary>
        /// <param name="iP1CardSum"></param>
        /// <param name="iP2CardSum"></param>
        /// <returns></returns>
        public string PlayerResult(int iP1CardSum, int iP2CardSum)
        {
            string strReturn = string.Empty;
 
            if (iP1CardSum > iP2CardSum)
            {
                strReturn = "Player1이 이겼습니다.";
            }
            else if (iP1CardSum < iP2CardSum)
            {
                strReturn = "Player2가 이겼습니다.";
            }
            else
            {
                strReturn = "비겼습니다.";
            }
 
            return strReturn;
        }
 
    }
}
 
cs


강의)

강의가 너무 길어진것 같은데 (집중도 해야하고 UI 그리는 시간도 있고 해서 보고 따라하시려면 강의를 보는 사람 기준으로 하루에 한시간~한시간반 정도로 하려면 30분 내외가 적당할것으로 판단 했는데 50분강의가 되었습니다. (__)

코드를 이런 저런식으로 변형 하다보니 시간이 많이 걸렸는데 이해가 안되더라도 한번 여기저기 위치를 옮겨보고 실행 해보고 하면서 작성 해보시면 많은 도움이 될것이라고 생각 합니다. 

출장을 다녀와서 목소리가 갈라지네요;; 죄송합니다.~ ^^;; 

주말에 부모님 뵈러 가야되서 약간 무리해서 녹화 하였습니다. 

다들 슈퍼 개발자를 목표로!! 즐공하세요~^^


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