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("무승부 입니다.");
}
}
}
}
}