Wanna be Brilliant Full-Stack Developer
C# WinForms 클래스의 생성및 사용 본문
상속은 부모 클래스가 두개가 있으면 부모클래스가 가지고 있는 하위 항목들
필드, 메서드와 같은것들을 하위클래스에서 가져와서 사용할 수 있다.
하위클래스는 부모클래스의 상속을 받아서 만들면 굳이 따로 만들지 않아도 사용이 가능하다.
오버라이드와 오버로딩!
오버로딩 같은경우에는 이름이 똑같은 메소드인데 인자들을 다르게 해서 같은 함수를
여러개 쓸 수 있도록 해주는것이다.
그 다음에 오버라이딩은? 기존에 있던거를 불러와서 같은 이름인데
내용을 다르게 해서 새로 만드는것이다.
생성자는? 클래스를 호출을 할때 NEW로 해서 하는데!
NEW를 할때 클래스와 이름이 똑같은 함수가 하나생긴다.
이걸 만들어 놓으면 그 안에 잇는 내용들을 여기 안에 있는 내용들을 안에서 작접을 하고
끝낼수있다. 안만들어도 실행을 할때 있는것처럼 할 수 있다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Struct_Class
{
internal class CPlayer
{
//public int iCount = 0; // Player가 몇회 진행 중인지
//public int iSun = 0; // 해에 대한 값
//public int iMoon = 0; // 달에 대한 값
//public int iStar = 0; // 별에 대한 값
//public int iCardSum = 0; // 해, 달, 별을 더한 값
// 값들을 더해서 반환
public int CardSun(int iSun, int iMoon, int iStar)
{
return iSun + iMoon + iStar;
}
// 결과를 String 형태로 변환 (화면에 결과를 보여주기 위해 사용)
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);
}
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));
// return string.Format("{0}회차 : Player2 가 {1} 만큼 더 큽니다.", iCount, iCheck * -1 );
}else
{
return string.Format("{0}회차 : Player 1과 Player 2의 값이 같습니다. ");
}
}
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;
}
}
}
CPlayer 클래스!
using System.Windows.Forms;
using System;
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 = Struct_Class;
namespace 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(1, 21);
//어떤 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(1, 21);
//어떤 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(1, 21);
//어떤 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에 넣어줌
}
}
}
}
}
클래스를 잘사용하면 기존에 한군데에 다 모아놓은 함수들중에 계산식 만 빼놔서
쭉 클래스에 모아놓고 불러놓고 결과값만 불러줄 수있도록 사용할 수 있다.
'Some Memos > C#' 카테고리의 다른 글
C# Winforms 오버라이딩과 오버로딩 (0) | 2023.04.13 |
---|---|
C# WINFORMS 상속 및 접근제어 #1 (0) | 2023.04.13 |
C# DB 연동 SqlDataAdapter vs SqlDataReader (0) | 2023.04.12 |
C# WinForms 구조체와 클래스 (0) | 2023.04.10 |
C# Winforms while, do while (0) | 2023.04.10 |