[문과 코린이의 IT 기록장] C# 기초 예시 - 클래스(Class) : 생성자, 소멸자
[문과 코린이의 IT 기록장] C# 기초 예시 - 클래스(Class) : 생성자, 소멸자
0. C#_ 클래스(Class)의 생성 및 사용
- 클래스와 관계된 내용들 : 상속, 접근 제한자, 캡슐화, 다형성(overide, overload), partial 등
- 생성자
: 생성자의 경우 클래스명과 동일하게 지정해서 사용하며, 클래스가 생성될 때 (new) 자동으로 호출
: 생성자를 만들어 놓지 않을 경우, 프로그램에서 자동으로 생성 (기본 생성자)
- 소멸자
: 클래스 소멸시 자동으로 호출
: 소멸시점 확인용으로 활용됨
ex)
class CPlayer{
public int Cont = 0; // 필드
public CPlayer(){ // 생성자
Console.WriteLine("생성자 생성 표시");
}
~CPlayer(){ // 소멸자
Console.WriteLine("생성자 소멸 표시");
}
public int CardSum(int iSun, int iMoon, int iStar){ // 메서드
return iSun+iMoon+iStar;
}
}
1. UI 부분
2. 코드 부분
2-1) 클래스
# 클래스 부분 따로 만들기 ) 프로젝트 - 새 항목 추가 - 클래스 - 네임스페이스 통일 되어 있는지 확인
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20210606_Struct__Class // 네임스페이스가 폼 부분이랑 동일한지 확인하기
{
class classPlayer
{
[ 메소드들은 클래스로 묶는 경우가 많음 ]
public int CardSum(int iSun, int iMoon, int iStar) // 해+달+별 계산 메소드
{
return iSun + iMoon + iStar;
}
public string ResultText(int iCount, int iSun, int iMoon, int iStar, int iCardSum)
// 결과를 string 형태로 변환해서, 화면에 보여주기 위해 활용하는 메소드
{
return string.Format("{0}회 : 해 {1}, 달 {2}, 별 {3} -> 합계는 {4}입니다", iCount, iSun, iMoon, iStar, iCardSum);
}
public string PlayerPair(int iCount, int iP1CardSum, int iP2CardSum) // Player 값을 비교할때 사용할 메소드
{
int iCheck = iP1CardSum - iP2CardSum; // 어떤 값이 더 큰지 비교할, iCheck 필드
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));
// iCheck * -1해도 됨. : 음수의 값을, 양수로 변환하기 위한 것
}
else
{
return string.Format("{0}회차 : Player1과 Player2의 값이 같습니다, iCount);
}
}
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; // 문자열 반환
}
2-2) 폼
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 _20210606_Struct__Class
{
public partial class Form1 : Form
{
struct structPlayer
{
[ 간단한구조 및 값정보를 저장하는 부분들은, 주로 구조체로 구현함 ]
public int iSun;// 해에 대한 값
public int iMoon; // 달에 대한 값
public int iStar; // 별에 대한 값
public int iCardSum; // 해+달+별 값
public int iCount; // Player가 몇회째 진행중인가를 저장한 값
}
structPlayer _stPlayer1; // 1번 Player
structPlayer _stPlayer2; // 2번 Player
classPlayer CPlayer = new classPlayer();
// 기존에는 classPlayer에서 정보까지 담고 있었는데, 이제 CPlayer로 함수만 전달하는 매개체로써 활용
Random _rd = new Random();
public Form1()
{
InitializeComponent();
}
private void pboxSun_Click(object sender, EventArgs e) // 해 버튼을 클릭했을 때
{
int iNumber = _rd.Next(1, 21); // 1<=x<21
if (rdoPlayer1.Checked)
{
_stPlayer1.iSun = iNumber; // 정보를 담고있는 객체 _stPlayer1의 iSun값에다, iNumber의 값을 넣어라
}
else
{
_stPlayer2.iSun = iNumber;
}
Result();
}
private void pboxMoon_Click(object sender, EventArgs e) // 달 버튼을 클릭했을 때
{
int iNumber = _rd.Next(1, 21);
if (rdoPlayer1.Checked)
{
_stPlayer1.iMoon = iNumber;
}
else
{
_stPlayer2.iMoon = iNumber;
}
Result();
}
private void pboxStar_Click(object sender, EventArgs e) // 별 버튼을 클릭했을 때
{
int iNumber = _rd.Next(1, 21);
if (rdoPlayer1.Checked)
{
_stPlayer1.iStar = iNumber;
}
else
{
_stPlayer2.iStar = iNumber;
}
Result();
}
private void pboxNone_Click(object sender, EventArgs e) // 한 턴 넘기는 버튼을 클릭했을 때
{
Result();
}
private void iCheckChange() // 클릭할 때마다, 한 턴 넘기는 메소드
{
if (rdoPlayer1.Checked)
{
rdoPlayer2.Checked = true
}
else
{
rdoPlayer1.Checked = true
}
}
private void Result() // 결과값을 보여주는 메소드
{
string strResult = string.Empty;
// 결과값 변화 및 lboxResult1, lboxResult2에 출력
if (rdoPlayer1.Checked) // 현재 Player1이 체크되어있으면
{
_stPlayer1.iCount++; // _stPlayer1의 진행횟수 변수 iCount를 1 증가시켜라
_stPlayer1.iCardSum = CPlayer.CardSum(_stPlayer1.iSun, _stPlayer1.iMoon, _stPlayer1.iStar);
// _stPlayer1의 iCardSum부분에, CPlayer클래스의 CardSum()메소드의 반환값을 넣어라
strResult = CPlayer.ResultText(_stPlayer1.iCount, _stPlayer1.iSun, _stPlayer1.iMoon, _stPlayer1.iStar, _stPlayer1.iCardSum);
// 문자열 strResult에, CPlayer클래스의 ResultText()메소드의 반환값을 넣어라
lboxResult1.Items.Add(strResult); // 리스트박스 lboxResult1부분에, strResult문자열 값을 추가시켜라
}
else
{
_stPlayer2.iCount++;
_stPlayer2.iCardSum = CPlayer.CardSum(_stPlayer2.iSun, _stPlayer2.iMoon, _stPlayer2.iStar);
strResult = CPlayer.ResultText(_stPlayer2.iCount, _stPlayer2.iSun, _stPlayer2.iMoon, _stPlayer2.iStar, _stPlayer2.iCardSum);
lboxResult2.Items.Add(strResult);
}
// 턴을 변환시켜라
iCheckChange();
// [lboxNow] 결과값 문자열 출력해주기
if(_stPlayer1.iCount == _stPlayer2.iCount ) // 둘 다 한번씩 호출해주면 문자열 출력해주기
{
lboxNow.Items.Add(CPlayer.PlayerPair(_stPlayer2.iCount, _stPlayer1.iCardSum, _stPlayer2.iCardSum));
if (_stPlayer2.iCount >= 5) // Player2가 5번이 넘으면, 최종승리 문자열 출력해주기
{
lboxNow.Items.Add(CPlayer.PlayerResult(_stPlayer1.iCardSum, _stPlayer2.iCardSum));
}
}
}
}
}
3. 결과물 부분
4. C#기초 예시 / 참고 자료를 더 보고 싶다면?
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |