본문 바로가기

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

[문과 코린이의 IT 기록장] C# 기초 예시 - 오버라이딩과 오버로딩

반응형


0. C# _ 오버라이딩, 오버로딩에 관해서

- 오버라이딩(Overriding) [ 상속 ]

 : 부모 클래스의 메소드자식 클래스에서 재정의 하여 사용함.

 : 부모 클래스에서는 virtual을 설정하고, 자식 클래스에서는 override로 정의함.

- 오버로딩(Overloading) [ 메소드 ]

 : 동일한 이름의 메소드를 인자(매개변수)의 개수나 형식을 다르게 해서 여러개 생성

 : 동일 목적의 메소드를 여러 방법으로 정의할 때 사용

 

[ 이 예시의, 상속 구조 ]

저번 사례와 비교해보면서 학습하기


1. UI부분

// 지난주랑 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; // 펜 객체

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

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

[ System.Drawing 네임스페이스 ]
: GDI+ 기본 그래픽 기능에 대한 액세스를 제공한다.
 * GDI : 윈도우즈의 출력장치간의 차이점을 숨기고 공통의 GDI API 함수를 이용하여 출력기능을 담당하는 윈도우즈 API
 * GDI+ : 기존의 GDI는 고수준의 API 함수 즉 C언어 형태의 기반을 둔 기능들의 묶음

# Pen 클래스 : 선과 곡선을 그리는데 사용되는 개체를 정의한다. 이 클래스는 상속될 수 없다.
# Rectangle 클래스 : 지정된 위치와 크기를 사용해 Rectangle 클래스의 새 인스턴스를 초기화한다.
# Point 구조체 : 2차원 평면에 있는 한 점을 정의하는 정수 X 및 Y좌표 순서 쌍을 나타낸다.
# Graphics 클래스 : GDI+ 그리기 화면을 캡슐화한다. 이 클래스는 상속될 수 없다.
# DrawRectangel 메서드 : 좌표 쌍, 너비 및 높이에 의해 지정된 사각형을 그린다.
# DrawEllipse 메서드 : 좌표, 높이, 너비의 쌍으로 지정된 경계 사각형에 의해 정의되는 타언을 그린다.

  public CBase() // CBase 생성자

 {

   _Pen = new Pen(Color.Aqua); // Pen타입의 _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) // COneCycles의 생성자 (상속을 통해 이전 사례보다 정의하는 과정이 줄어듦)

 { 

   strName = sName; // 이름 

   _Pen = new Pen(Color.WhiteSmoke,3);

 // Pen타입의 _Pen 객체에, new Pen(색상, 너비, 굵기) 의 값을 가진 객체를 생성해서 담는다.

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

// Rectangle 타입의 _rtCircle1 객체에, new Rectange(x좌표, y좌표, 너비, 높이)의 값을 가진 객체를 생성해서 담는다.

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

// Rectangle 타입의 _rtCircle2 객체에, new Rectange(x좌표, y좌표, 너비, 높이)의 값을 가진 객체를 생성해서 담는다.

 }

 

 

[ 오버라이딩 활용 ]

 public virtual void fMove(int iMove) // fMove 함수

 {

   fCircle1Move(iMove);

   fSquare1Move(iMove);

 }

 

// 내부에서만 움직이는 함수

 protected void fCircle1Move(int iMove) // fCircle1Move 함수 (X값 이동. 좌우로 이동)

 {

   Point oPoint = _rtCircle1.Location; // _rtCircle1의 좌표를 가져와서, Point형 oPoint객체에 값을 담는다.

Rectangle.Location 속성
: 이 Rectangle 구조체의 왼쪽 위 모퉁이의 좌표를 가져오거나 설정한다. (X,Y)
 * 네임스페이스 : System.Drawing

   oPoint.X = oPoint.X + iMove; // oPoin객체의 X값에 iMove만큼 더해서, 다시 저장한다.

   _rtCircle1.Location = oPoint; // 새로운 oPoint값을, _rtCircle1 객체의 X,Y좌표에 저장한다.

 }

 

// 내부에서만 움직이는 함수

 protected void fSquare1Move(int iMove) // fSquare1Move 함수 (X값 이동. 좌우로 이동)

 {

   Point oPoint = _rtSquare1.Location; // _rtSquare1의 좌표를 가져와서, Point형 oPoint 객체에 값을 담는다.

   oPoint.X = oPoint.X + iMove; // oPoint 객체의 X값에 iMove만큼 더해서, 다시 저장한다.

   _rtSquare1.Location = oPoint; // oPoint 객체 값을, _rtSqure1 객체의 X,Y 좌표에 저장한다.

 }

 

 

[ 오버로딩 활용 ]

 public Pen fPenInfo()  // fPenInfo() 함수

 {

   //_Pen = new Pen(Color.WhiteSmoke, 3); // 색상변경하고싶을경우넣기

   return _Pen; // Pen형으로 반환해야함.

 }

 

 public Pen fPenInfo(Color oColor) // fPenInfo(색상변환) 함수

 {

   _Pen = new Pen(oColor); // 새로 받아온 값

   return _Pen;

 }

 

 public Pen fPenInfo(Color oColor,int iWidth) // fPenInfo(색상변환, 굵기변환) 함수

 {

   _Pen = new Pen(oColor,iWidth); // 새로 받아온 값

   return _Pen;

 }

}

}

 

 

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 : COneCycles

{

 public Rectangle _rtCircle2; // 바퀴 객체

 

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

 {

   strName = sName; // 이름

   _Pen = new Pen(Color.Black, 3);

 // Pen 타입의 _Pen 객체에, new Pen(색상, 너비, 굵기)의 값을 가진 객체를 생성해 담는다.

 

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

// Rectangle 타입의 _rtCircle1 객체에, new Rectange(x좌표, y좌표, 너비, 높이)의 값을 가진 객체를 생성해서 담는다.

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

// Rectangle 타입의 _rtCircle2 객체에, new Rectange(x좌표, y좌표, 너비, 높이)의 값을 가진 객체를 생성해서 담는다.

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

// Rectangle 타입의 _rtSquare1 객체에, new Rectange(x좌표, y좌표, 너비, 높이)의 값을 가진 객체를 생성해서 담는다.

 }

 

[ 오버라이딩 활용 ]

 public override void fMove(int iMove) // fmove 함수 오버라이딩 (재사용, 확장 용이)

 {

 /* 이와같이 모든 부분을 새로 생성해줘도 되고, 오버라이드를 써도 됨 */

   // fCircle1Move(iMove);

   // fCircle2Move(iMove); // 새로 생긴 부분

   // fSquare1Move(iMove);

 

 /* 오버라이드 활용 */

   base.fMove(iMove); // 부모 클래스에서, fmove라는 함수를 가져와서 활용 (상위클래스의 생성자를 호출할 때 사용)

   fCircle2Move(iMove);

 } 

 

 protected void fCircle2Move(int iMove) //

 {

   Point oPoint = _rtCircle2.Location; // _rtCircle2의 좌표를 가져와서, Point형 oPoint 객체에 값을 담는다.

   oPoint.X = oPoint.X + iMove; // oPoint 객체의 X값에 iMove만큼 더해서, 다시 저장한다.

   _rtCircle2.Location = oPoint; // oPoint 객체 값을, _rtCircle1 객체의 X,Y 좌표에 저장한다.

 }

}

}

 

 

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

{

 public Rectangle _rtSquare2; // 몸통 2 객체

 

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

 {

   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 override void fMove(int iMove) // fMove 함수

 {

   // fCircle1Move(iMove);

   // fCircle2Move(iMove);

   // fSquare1Move(iMove);

   // fSquare2Move(iMove);

   

   base.fMove(iMove);

   fSquare2Move(iMove);

 }

 

 protected void fSquare2Move(int iMove) // fSqure2Move 함수

 {

   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("외발자전거 "); // COneCycles의 생성자 실행 (이름 : 외발자전거) 후, _c0C객체에 담기

   _cC = new CCycle("자전거 ");  // CCycle의 생성자 실행 (이름 : 자전거) 후, _cC객체에 담기

   _cCar = new CCar("자동차 "); // CCar의 생성자 실행 (이름 : 자동차) 후, _cCar객체에 담기

 }

 

 

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

 {

   PMain.Invalidate(); // PMain(메인 판넬 부분)을, 즉 컨트롤의 전체 화면을 무효화하고 컨트롤을 다시 글린다.

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

컨트롤이란?
- 윈도우를 구성하는 독립적인 화면 구성 요소.

 }

[ System.Drawing 네임스페이스 ]
: GDI+ 기본 그래픽 기능에 대한 액세스를 제공한다.
 * GDI : 윈도우즈의 출력장치간의 차이점을 숨기고 공통의 GDI API 함수를 이용하여 출력기능을 담당하는 윈도우즈 API
 * GDI+ : 기존의 GDI는 고수준의 API 함수 즉 C언어 형태의 기반을 둔 기능들의 묶음

# Pen 클래스 : 선과 곡선을 그리는데 사용되는 개체를 정의한다. 이 클래스는 상속될 수 없다.
# Rectangle 클래스 : 지정된 위치와 크기를 사용해 Rectangle 클래스의 새 인스턴스를 초기화한다.
# Point 구조체 : 2차원 평면에 있는 한 점을 정의하는 정수 X 및 Y좌표 순서 쌍을 나타낸다.
# Graphics 클래스 : GDI+ 그리기 화면을 캡슐화한다. 이 클래스는 상속될 수 없다.
# DrawRectangel 메서드 : 좌표 쌍, 너비 및 높이에 의해 지정된 사각형을 그린다.
# DrawEllipse 메서드 : 좌표, 높이, 너비의 쌍으로 지정된 경계 사각형에 의해 정의되는 타언을 그린다.

 

 private void btnOneCycle_Click(object sender, EventArgs e) // COneCycle(외발자전거) 버튼을 클릭했을 때

 {

   fClearPanel();

   OneCycleDraw();

 }

 

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

 {

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

   Graphics g = PMain.CreateGraphics(); // g객체에, PMain 판넬의 Graphics를 만들어 넣는다.

# Control.CreaeteGraphics메서드 
: 해당 컨트롤에 대한 Graphics를 만든다.
 * 네임스페이스 : System.Windows.Forms

   Pen p = _c0C.fPenInfo(Color.Bisque,10); (오버로딩 부분)

   g.DrawRectangle(p, _c0C._rtSquare1);  // DrawRectangle(Pen, Rectangle)로 지정된 사각형을 그린다.

   g.DrawEllipse(p, _c0C._rtCircle1); // DrawEllipse(Pen, Rectangle)로 지정된 타원을 그린다.

}

 

 

 private void btnCycle_Click(object sender, EventArgs e) // CCycle(자전거)버튼을 클릭했을 때

 {

   fClearPanel();  

   CCycleDraw();

 }

 

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

 {

   lblName.Text = _cC.strName; 

   Graphics g = PMain.CreateGraphics();  

   Pen p = _cC.fPenInfo(Color.Cyan,2); 

   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() // Car에 대한 위치 그림을 그려준다

 {

   lblName.Text = _cCar.strName;

   Graphics g = PMain.CreateGraphics();

   Pen p = _cCar.fPenInfo(Color.Gold, 5);// 오버로딩

   g.DrawRectangle(p, _cCar._rtSquare1);

   g.DrawRectangle(p, _cCar._rtSquare2);

   g.DrawEllipse(p, _cCar._rtCircle1);

   g.DrawEllipse(p, _cCar._rtCircle2); 

 }

 

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

 {

   fMoving(-5);

 }

 

 private void fMoving(int iMove) // fMoving 함수

 {

   fClearPanel();

 

   switch (lblName.Text) // lblName라벨의 Text부분의 조건에 따라서 실행하기

   {

     case "외발자전거 ":

        _c0C.fMove(iMove);

        OneCycleDraw();

        break 

     case "자전거 ":

        _cC.fMove(iMove);

        CCycleDraw();

        break

     case "자동차 ":

        _cCar.fMove(iMove);

        CarDraw();

        break

     default:

        break

   }

 }

 

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

 {

   fMoving(5);

 }

}

}

 

 

 


3. 결과물 부분


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

 


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