본문 바로가기

문과 코린이의, [C#] 기록/C# 활용

[문과 코린이의 IT 기록장] C# 기초 예시 - 클래스(Class) : 생성자, 소멸자

반응형

[문과 코린이의 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#기초 예시 / 참고 자료를 더 보고 싶다면?

 


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형