본문 바로가기

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

[문과 코린이의 IT 기록장] C# 기초 예시 - 구조체(Struct), 클래스(Class)

반응형

[문과 코린이의 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 (힙 메모리)

- 필요에 의해 동적으로 생성하고 원할 때 소멸

- 생성과 소멸 관리 필요, 메모리 누수에 대한 관리가 필요함

 

C++ 클래스에 대해 더 알고 싶다면?

 


1. UI 부분

# Picturebox - Panel이랑 하는 역할은 비슷하지만, 그림을 가져오는데 좀 더 특화되어 있음

 - StretchImage : 이미지가 변형되더라도 크기에 맞춤

 - AutoSize : 이미지 사이즈에 맞춤

 - CenterImage : 이미지 크기를 가져가되, 가운데에 맞춤

 - Zoom : 이미지를 꽉 들어차게 만들고, 여백은 그냥 냅두기

PictureBox 작업

# 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#기초 예시 / 참고 자료를 더 보고 싶다면?

 


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