11. C# Winform – 구조 및 클래스

11. 구조(구조, 클래스)

  • 구조는 값 유형 Data, 참조 유형 Data의 클래스입니다.
  • 구조는 상속할 수 없습니다.
  • 구조체는 값 형식의 데이터이며 다시 선언하지 않고도 즉시 사용할 수 있습니다.
  • 구조체는 간단한 구조체를 정의하는 데 사용되며 클래스는 구조체와 상향 호환됩니다.
  • C#의 경우 C 및 C++ Source와의 호환성을 위한 구조체 지원
세부 사항 구조 수업
저장 스택 메모리 힙 메모리
사유지 상속 불가 유전
사용 사용할 준비가 신규로 생성 및 사용
기본값으로 재설정 필드를 초기화할 수 없습니다. 필드를 초기화할 수 있습니다.

※ 저장

1) 스택 메모리

  • 함수를 호출할 때 생성되는 지역 및 매개변수를 지정합니다.
  • 함수 호출이 완료되면 소멸

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 Struct_Class
{
    public partial class Form1 : Form
    {
        struct structPlayer
        {
            public int iCount; // Player가 몇회 진행 중

            public int iSun; // 해에 대한 값
            public int iMoon; // 달에 대한 값
            public int iStar; // 별에 대한 값

            public int iCardSum; // 해, 달, 별을 더한 값

            // 값들을 더 해서 반환
            public int CardSun(int iSun, 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);
            }
        }

        // 구조체 생성 (전역 변수)
        structPlayer _stPlayer1; // 1번 Player
        structPlayer _stPlayer2; // 2번 Player

        // 전역 변수
        Random _rd = new Random();

        public Form1()
        {
            InitializeComponent();
        }

        private void pboxSun_Click(object sender, EventArgs e)
        {

            int iNumber = _rd.Next(1, 21);

            if (rdoPlayer1.Checked)
            {
                _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 iCheckedChanger()
        {
            if (rdoPlayer1.Checked)
            {
                rdoPlayer2.Checked = true;
            }
            else
            {
                rdoPlayer1.Checked = true;
            }
        }

        private void Result()
        {
            string strResult = string.Empty;

            if (rdoPlayer1.Checked)
            {
                _stPlayer1.iCount++;

                _stPlayer1.iCardSum = _stPlayer1.CardSun(_stPlayer1.iSun, _stPlayer1.iMoon, _stPlayer1.iStar);

                strResult = _stPlayer1.ResultText();

                lboxResult1.Items.Add(strResult);
            }
            else
            {
                _stPlayer2.iCount++;

                _stPlayer2.iCardSum = _stPlayer2.CardSun(_stPlayer2.iSun, _stPlayer2.iMoon, _stPlayer2.iStar);

                strResult = _stPlayer2.ResultText();

                lboxResult2.Items.Add(strResult);
            }

            iCheckedChanger();

            if (_stPlayer1.iCount >= 5 && _stPlayer2.iCount >= 5)
            {
                if (_stPlayer1.iCardSum > _stPlayer2.iCardSum)
                {
                    MessageBox.Show("Player1 이겼습니다.");
                }
                else if (_stPlayer1.iCardSum < _stPlayer2.iCardSum)
                {
                    MessageBox.Show("Player2 이겼습니다.");
                }
                else
                {
                    MessageBox.Show("무승부 입니다.");
                }
                
            }
        }
    }
}