Wanna be Brilliant Full-Stack Developer

C# WinForms 클래스의 생성및 사용 본문

Some Memos/C#

C# WinForms 클래스의 생성및 사용

Flashpacker 2023. 4. 12. 15:14

상속은 부모 클래스가 두개가 있으면 부모클래스가 가지고 있는 하위 항목들

필드, 메서드와 같은것들을 하위클래스에서 가져와서 사용할 수 있다.

하위클래스는 부모클래스의 상속을 받아서 만들면 굳이 따로 만들지 않아도 사용이 가능하다.

 

오버라이드와 오버로딩! 

오버로딩 같은경우에는 이름이 똑같은 메소드인데 인자들을 다르게 해서 같은 함수를

여러개 쓸 수 있도록 해주는것이다.

 

그 다음에 오버라이딩은? 기존에 있던거를 불러와서 같은 이름인데

내용을 다르게 해서 새로 만드는것이다.

 

생성자는? 클래스를 호출을 할때 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에 넣어줌
                }
            }
        }
    }
}

 

클래스를 잘사용하면 기존에 한군데에 다 모아놓은 함수들중에 계산식 만 빼놔서 
쭉 클래스에 모아놓고 불러놓고 결과값만 불러줄 수있도록 사용할 수 있다.