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

[문과 코린이의 IT 기록장] C# 기초 예시 - 상속 및 접근제어

벼리네 2021. 6. 12. 10:07
반응형

 


0. C# _ 상속 및 접근제어에 관해서

- 상속 : 부모 클래스의 내용을 상속받은 자식 클래스가 물려받는것. 재사용 및 확장에 용이

 * 자식 클래스에서 부모 클래스가 가지고 있는 내용을 사용 가능

- 접근 제어 : 부모 클래스의 내용을 자식 클래스 및 외부에서 접근하는 권한을 제어

 

[ 이 예시의, 상속과 접근 제어 구조 ]


1. UI 부분


2. 코드 부분

2-1 ) CBase 클래스

using System;

using System.Collections.Generic;

using System.Drawing; // Pen을 쓰기 위해서는, 이것이 있어야 함.

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace _20210608_inheritance // 네임스페이스 일치하는지 확인하기

{

class CBase

{

 public string strName; // 이름 변수 

 protected Pen _Pen; // Pen 클래스의, _Pen 객체

// private : 이 클래스 내부에서만, Pen을 쓸 수 있음. 상속받은 애들 또한 볼 수 없음.

// Protected : 외부에서 볼수없음. 그러나, 상속받은 애들은 볼 수 있음.

 

 public CBase() // 생성자

 {

   _Pen = new Pen(Color.Aqua);

 } 

}

}

 

 

2-2 ) COneCycles 클래스

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Drawing; 

 

namespace _20210608_inheritance

{

class COneCycles : CBase // COneCycles는 CBase를 상속받아 만든 클래스이다.

{

 public Rectangle _rtCircle1; // 바퀴 1

 public Rectangle _rtSquare1; // 몸통 1

  

 public COneCycles(string sName) // 생성자

 {

   strName = sName; // strName은 CBase에 존재하는 변수이므로, 상속받아 사용 가능

   _Pen = new Pen(Color.WhiteSmoke,3); // Pen(색상, 너비, 굵기)

  

   _rtCircle1 = new Rectangle(120, 150, 120, 120);

   _rtSquare1 = new Rectangle(150, 30, 60, 120);

 }

 

 public Pen fPenInfo() // 해당 객체에 대한, 펜 정보 반환 메소드

 {

   return _Pen;

 }

 

[ 외부에서 호출 가능하도록 ]

public void fMove(int iMove) // 펜 이동 메소드 (바퀴 이동 메소드 + 몸통 이동 메소드)

{

 fCircle1Move(iMove);

 fSquare1Move(iMove);

}

 

[ 내부에서만 움직인다 ]

protected void fCircle1Move(int iMove) // 바퀴 이동 메소드

{

 Point oPoint = _rtCircle1.Location;

 oPoint.X = oPoint.X + iMove; // iMove만큼 움직인다

 _rtCircle1.Location = oPoint;

}

 

protected void fSquare1Move(int iMove) // 몸통 이동 메소드

{

 Point oPoint = _rtSquare1.Location;

 oPoint.X = oPoint.X + iMove;

 _rtSquare1.Location = oPoint;

}

 

}

}

 

 

2-3 ) CCycle 클래스

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Drawing;

 

namespace _20210608_inheritance

{

class CCycle : CBase

{

 public Rectangle _rtCircle1; // 바퀴 1

 public Rectangle _rtCircle2; // 바퀴 2

 public Rectangle _rtSquare1; // 몸통 1

 

 public CCycle(string sName)  // 생성자

 {

   strName = sName; // 이름을정의할필요가없음 상속받아서tring strName의값이옴

   _Pen = new Pen(Color.Black, 3); // 색상 너비굵기

 

   _rtCircle1 = new Rectangle(30,150,120,120);

   _rtCircle2 = new Rectangle(210,150,120,120);

   _rtSquare1 = new Rectangle(60,90,240,60);

 }

 

 public Pen fPenInfo() // 해당 객체에 대한, 펜정보 반환 메소드

 {

   return _Pen;

 }

 

[ 외부에서 호출 가능하도록 ]

 public void fMove(int iMove) // 펜 이동 메소드 (바퀴 1/2 이동 메소드 + 몸통 이동 메소드)

 {

   fCircle1Move(iMove);

   fCircle2Move(iMove);

   fSquare1Move(iMove);

 }

 

[ 내부에서만 움직인다 ]

 protected void fCircle1Move(int iMove) // 바퀴 1 이동 메소드

 {

   Point oPoint = _rtCircle1.Location;

   oPoint.X = oPoint.X + iMove; 

   _rtCircle1.Location = oPoint;

 }

 

 protected void fCircle2Move(int iMove) // 바퀴 2 이동 메소드

 {

   Point oPoint = _rtCircle2.Location;

   oPoint.X = oPoint.X + iMove;

   _rtCircle2.Location = oPoint;

 }

 protected void fSquare1Move(int iMove) // 몸통 1 이동 메소드

 {

   Point oPoint = _rtSquare1.Location;

   oPoint.X = oPoint.X + iMove;

   _rtSquare1.Location = oPoint;

 }

}

}

 

 

2-4 ) CCar 클래스

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Drawing;

 

namespace _20210608_inheritance

{

class CCar : CCycle // CCycle을 상속받음

{

 public Rectangle _rtSquare2; // 몸통

 

 public CCar(string sName) :base(sName) // 생성자

 {

   strName = sName;

   _Pen = new Pen(Color.Blue, 3); // 색상 너비굵기

 

   _rtCircle1 = new Rectangle(60, 180, 90, 90);

   _rtCircle2 = new Rectangle(210, 180, 90, 90);

   _rtSquare1 = new Rectangle(90,30,180,90);

   _rtSquare2 = new Rectangle(30, 120, 300, 60);

}

 

[ 외부에서 호출 가능하도록 ]

 public new void fMove(int iMove) // 상속받은 이름이랑 같기 때문에 new를쓰자

 {

   fCircle1Move(iMove); // 상속받음

   fCircle2Move(iMove); // 상속받음

   fSquare1Move(iMove); // 상속받음

 

   fSquare2Move(iMove);

 }

 

 protected void fSquare2Move(int iMove) // 몸통 2 이동 메소드

 {

   Point oPoint = _rtSquare2.Location;

   oPoint.X = oPoint.X + iMove;

   _rtSquare2.Location = oPoint;

 }

}

}

 

 

2-5 ) Form 

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 _20210608_inheritance

{

public partial class Form1 : Form

{

 COneCycles _c0C; // 전역변수로 객체 생성

 CCycle _cC;

 CCar _cCar;

 

 public Form1()

 {

   InitializeComponent();

 }

 

 private void Form1_Load(object sender, EventArgs e) // 폼을 로드할 때

 {

   _c0C = new COneCycles("외발자전거 "); // 이름을 넣어줌으로써, 코드로 작성해준 객체 생성자 실행

   _cC = new CCycle("자전거 ");

   _cCar = new CCar("자동차 ");

 }

 

 private void btnOneCycle_Click(object sender, EventArgs e) // OneCycles버튼을 클릭했을 때

 {

   fClearPanel();

   OneCycleDraw();

 }

 

 private void OneCycleDraw()  // OneCycle에대한 위치 그림을 그려준다

 {

   lblName.Text = _c0C.strName; // _c0C의 이름을, lblName의 Text부분에 표시한다.

   

   Graphics g = PMain.CreateGraphics(); // Panel(PMain)에 그림을 그릴 것이며, 이 정보를 g객체에 저장한다.

   Pen p = _c0C.fPenInfo(); // _c0C 객체의 펜에대한 정보를 가져와서, p객체에 저장해준다.

   g.DrawRectangle(p, _c0C._rtSquare1); // 사각형 그리기 (p펜으로, _c0C객체에 저장된 값으로)

   g.DrawEllipse(p, _c0C._rtCircle1);

}

 

 

 private void btnCycle_Click(object sender, EventArgs e) // Cycle 버튼을 클릭했을 때

 {

   fClearPanel();

   CCycleDraw();

 }

 

 private void CCycleDraw() // Cycle에 대한 위치 그림을 그려준다.

 {

   lblName.Text = _cC.strName;

 

   Graphics g = PMain.CreateGraphics();

   Pen p = _cC.fPenInfo(); 

   g.DrawRectangle(p, _cC._rtSquare1);

   g.DrawEllipse(p, _cC._rtCircle1);

   g.DrawEllipse(p, _cC._rtCircle2);

}

    

 private void btnCar_Click(object sender, EventArgs e) // Car버튼을 클릭했을 때

 {

   fClearPanel();

   CarDraw();

 }

 

 private void CarDraw() // OneCycle에대한위치그림을그려준다

 {

   lblName.Text = _cCar.strName;

 

   Graphics g = PMain.CreateGraphics();

   Pen p = _cCar.fPenInfo();

   g.DrawRectangle(p, _cCar._rtSquare1);

   g.DrawRectangle(p, _cCar._rtSquare2);

   g.DrawEllipse(p, _cCar._rtCircle1);

   g.DrawEllipse(p, _cCar._rtCircle2); 

}

 

 

private void fClearPanel() // 판넬 새로 그려주기

{

PMain.Invalidate(); // 컨트롤의 전체 화면을 무효화하고, 컨트롤을 다시 그린다.

Refresh(); // 컨트롤이 해당 컨트롤의 클라이언트 영역을 강제로 무효화하도록 하고, 컨트롤 자체와 모든 자식 컨트롤을 즉시 다시 그리도록 한다.

}

 

 

 private void btnLeft_Click(object sender, EventArgs e) // Left 버튼을 눌렀을 때

 {

 fClearPanel();

 

 switch (lblName.Text)

 {

   case "외발자전거 ":

     _c0C.fMove(-5);

     OneCycleDraw();

     break;

   case "자전거 ":

     _cC.fMove(-5);

     CCycleDraw();

     break;

   case "자동차 ":

      _cCar.fMove(-5);

     CarDraw();

     break;

   default:

     break;

   }

 }

 

 private void btnRight_Click(object sender, EventArgs e) // Right 버튼을 눌렀을 때

 {

 fClearPanel();

 

 switch (lblName.Text)

 {

   case "외발자전거 ":

     _c0C.fMove(5); 

     OneCycleDraw();

     break;

   case "자전거 ":

     _cC.fMove(5);

     CCycleDraw();

     break;

   case "자동차 ":

     _cCar.fMove(5);

     CarDraw();

     break;

   default:

     break;

   }

 }

}

}

 


3. 결과물 부분


4. C#기초 예시 / 참고 자료를 더 보고 싶다면?


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