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#기초 예시 / 참고 자료를 더 보고 싶다면?
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |
'문과 코린이의, [C#] 기록 > C# 활용' 카테고리의 다른 글
[문과 코린이의 IT 기록장] C# 기초 예시 - XMLReader, XMLWriter (0) | 2021.06.27 |
---|---|
[문과 코린이의 IT 기록장] C# 기초 예시 - StreamReader, StreamWrite (0) | 2021.06.26 |
[문과 코린이의 IT 기록장] C# 기초 예시 - 상속 및 접근제어 (0) | 2021.06.12 |
[문과 코린이의 IT 기록장] C# 기초 예시 - 클래스(Class) : 생성자, 소멸자 (1) | 2021.06.10 |
[문과 코린이의 IT 기록장] C# 기초 예시 - 구조체(Struct), 클래스(Class) (1) | 2021.06.09 |