[문과 코린이의 IT 기록장] C# 기초 예시 - 구조체(Struct), 클래스(Class)
[문과 코린이의 IT 기록장] C# 기초 예시 - 구조체(Struct), 클래스(Class)
0. C# _ 구조체(Struct), 클래스(Class)
: 데이터형 여러개를 한 번에 묶고 가져가고 싶을 때 활용
- 구조체 (Struct)
: 값 타입 Data
: 구조체는 상속이 불가능함
: new를 선언할 필요 없이 바로 사용 가능
- 클래스 (Class)
: 참조 타입 Data
: 클래스는 상속 가능
: new를 선언할 필요 존재. ex) 클래스이름 객체이름 = new 클래스이름( );
# 간단한 구조를 정의할 때, 구조체를 사용. 클래스가 구조체의 상위호환
# C#의 경우 C,C++ 소스와의 호환을 위해 구조체 지원
내용 | 구조체(Struct) | 클래스(Class) |
메모리 | Stack Memory | Heap Memeory |
상속 | 불가능 | 가능 |
사용 | 바로 사용 가능 | new로 생성 후 사용 |
초기화 | 필드를 초기화 할 수 없음 | 필드를 초기화할 수 있음 |
* Stack Memory(스택 메모리)
- 함수 호출 시 생성되는 지역 및 매개 변수들이 지정
- 함수 호출이 완료되면 소멸
* Heap Memory (힙 메모리)
- 필요에 의해 동적으로 생성하고 원할 때 소멸
- 생성과 소멸 관리 필요, 메모리 누수에 대한 관리가 필요함
1. UI 부분
# Picturebox - Panel이랑 하는 역할은 비슷하지만, 그림을 가져오는데 좀 더 특화되어 있음
- StretchImage : 이미지가 변형되더라도 크기에 맞춤
- AutoSize : 이미지 사이즈에 맞춤
- CenterImage : 이미지 크기를 가져가되, 가운데에 맞춤
- Zoom : 이미지를 꽉 들어차게 만들고, 여백은 그냥 냅두기
# RadioButton - 둘 중에 하나를 선택하도록 하는 박스
# CheckBox - 개별적으로 몇 개든 선택할 수 있도록 하는 박스
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가 몇회째 진행중인가를 저장하는 변수
// 클래스 내부에서 메소드를 쓸 수 있음
public int CardSum(int iSun, int iMoon, int iStar) // 값들을 더해서 반환하는 함수
{
return iSun + iMoon + iStar;
}
public string ResultText() // 결과를 string 형태로 변환한 후, 화면에 보여주기 위한 함수
{
return string.Format("{0}회 ) 해 {1}. 달 {2}, 별 {3} -> 합계는 {4}입니다", iCount, iSun, iMoon, iStar, iCardSum);
}
}
class classPlayer // struct structPlayer와 같은 방식으로 구현한 것
{
public int iSun; // 해에 대한 값 변수 (클래스에서는 필드 초기화가 가능함. ex. public int iSun=2;)
public int iMoon; // 달에 대한 값 변수
public int iStar; // 별에 대한 값 변수
public int iCardSum; // 해+달+별 값 변수
public int iCount; // Player가 몇회째 진행중인가를 저장하는 변수
// 클래스 내부에서 메소드를 쓸 수 있음
public int CardSum(int iSun, int iMoon, int iStar) // 값들을 더해서 반환하는 함수
{
return iSun + iMoon + iStar;
}
public string ResultText() // 결과를 string 형태로 변환한 후, 화면에 보여주기 위한 함수
{
return string.Format("{0}회 ) 해 {1}. 달 {2}, 별 {3} -> 합계는 {4}입니다", iCount, iSun, iMoon, iStar, iCardSum);
}
}
// 객체 및 변수 앞에 '_'를 붙이면 전역이라는 의미
structPlayer _stPlayer1; // 1번 Player 객체 생성 (구조체)
structPlayer _stPlayer2; // 2번 Player 객체 생성 (구조체)
classPlayer _stPlayer1 = new classPlayer(); // 1번 Player 객체 생성 (생성자)
classPlayer _stPlayer2 = new classPlayer(); // 2번 Player 객체 생성 (생성자)
Random _rd = new Random(); // Random클래스를 전역변수로 지정
public Form1()
{
InitializeComponent();
}
private void pboxSun_Click(object sender, EventArgs e) // 해 그림을 클릭할 때
{
int iNumber = _rd.Next(1, 21); // 1<=x<21 난수를, iNumber변수에 저장
if (rdoPlayer1.Checked) // radiobutton의 rdoPlayer1이 체크되어 있다면
{
_stPlayer1.iSun = iNumber; // _stPlayer1의 Sun값에다가, iNumber의 값을 넣어라
}
else // radiobutton의 rdoPlayer2가 체크되어 있다면
{
_stPlayer2.iSun = iNumber;
}
Result(); // 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; // 결과값 문자열을 받아올 변수 지정 및 초기화
if (rdoPlayer1.Checked) // 만약 radiobutton의 rdoPlayer1가 체크되어있다면
{
_stPlayer1.iCount++;
// _stPlayer1객체의 iCount변수를 1증가시켜라 (횟수진행 +)
_stPlayer1.iCardSum = _stPlayer1.CardSum(_stPlayer1.iSun, _stPlayer1.iMoon, _stPlayer1.iStar);
// _stPlayer1객체의 CardSum()함수를 실행시키고, iCardSum변수에 저장해라
strResult = _stPlayer1.ResultText();
// _stPlayer1객체의 ResultText()함수를 실행시키고, strResult에 그 값(문자열)을 저장해라
lboxResult1.Items.Add(strResult);
// lboxReesult1 listlobx에, strResult값을 넣어라
}
else
{
_stPlayer2.iCount++;
_stPlayer2.iCardSum = _stPlayer2.CardSum(_stPlayer2.iSun, _stPlayer2.iMoon, _stPlayer2.iStar);
strResult = _stPlayer2.ResultText();
lboxResult2.Items.Add(strResult);
}
iCheckChange(); // iCheckedChange()함수 실행 (다음 플레이어 실행)
/* 게임 결과 */
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("비겼습니다");
}
}
}
}
}
3. 결과물 부분
4. C#기초 예시 / 참고 자료를 더 보고 싶다면?
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |