티스토리 뷰
======================================================
안녕하세요 Doridori 입니다.
12강 강의 부터 해서 클래스 관련된 내용을 진행 중인데 이번에는 오버라이딩(Override)과 오버로딩(Overload)에 대해서 진행 하겠습니다.
오버라이드와 오버로드 같은 경우는 어감이 비슷하다 보니 자주 헷갈리기도 하고 질문도 많이 되는 부분입니다.
(중요하기도 합니다.)
두개에 대해서 구분하는 방법은 Override의 경우 선언을 Override로 하기 때문에 어떤 내용인지 먼저 알아두시면 나머지 하나는 Overload 이다 라고 생각 하시면 구분이 쉬울것 같습니다.
======================================================
오버라이딩(Override)과 오버로딩(Overload)
Source UI) 지난번 강의 UI 사용 (Form Key Event 만 하나 추가)
Soruce 전체) Study_14_Override, Overload.zip
교재) 14강 오버라이딩(Override)과 오버로딩(Overload).pdf
오버라이드와 오버로드의 경우 비슷하게 묶어서 자주 나오기 때문에 함께 설명을 하려고 하였는데
그중에 오버라이드가 상속과 관련된 내용이다 보니 (상속에 대한 내용을 모르면 오버라이드를 이해 할 수 없기에 . . . ) 상속에 대해 설명이 끝난 이번 강의에 진행하게 되었습니다.
강의 내용이 어렵지도 않고 길지도 않기 때문에 이번에 꼭 구분 하셔서 직장이나 학교에서 질문이 들어왔을 때 막히지 않고 바로 대답할 수 있었으면 좋겠습니다.
(저희 부장님이 새로운 개발자 분들을 받으면 가장 먼저 물어보는 단골 내용 중 두개가 Override, Overload 관련된 내용과 DataSet과 DataTable의 차이점을 가장 먼저 물어보십니다.)
접근 제한자의 경우는 지난강의 때 내용은 설명을 드렸는데 요약 되어있는 부분을 만들지 않아서 이번강의 비어 있는 부분에 추가 하였습니다.
회색으로 표시한 부분은 설명드리지 않았는데 그렇게 자주 사용되는 부분이 아니어서 (어셈블리에 대한 설명을 하지 않았기 때문에) 그냥 넘겼습니다.
이런것도 있다 라는 정도로만 보고 넘어가시면 접근 제한자 부분에 뭔가 모르는게 보인다 라고 생각 되시면 떠올리실수 있을것 같습니다. (가볍게 넘겨 주세요)
지난간의 UI에서 Form에 Key Event를 하나 추가 하려고 하다보니 속석을 하나 변경 하게 되었습니다. (다른 부분은 기존강의와 같기 때문에 13강 UI 파일을 가져다가 수정해서 쓰셔도 됩니다. (지난번에 상속을 진행 할때 만들었던 클래스 구조를 변경 할 꺼라서 지난번 풀 소스를 가지고 시작을 하시면 됩니다. ^^;;)
강의)
중간에 PC가 먹통이 되어서 완전 긴장 했는데 1분정도 버벅된거 같습니다만 멈춘게 아니니 잠시만 기다려 주세요;; ㅜㅠ)
강의를 거의 다 만들었는데 키 Event 하나 더 넣어 보려다가 다날리면 완전 좌절 할 뻔해서 뒷부분이 완전 멘붕입니다. ㅎㅎ 이해해 주세요;; ㅜㅠ
Source)
지난번 강의에 비해서 상속 한뒤 Override를 사용 했을 때 소스가 더 간결해진 걸 확인 해주시면 되겠습니다.
상속을 해서 사용 할 경우 프로그램의 구조를 머리속에 그리면서 진행을 하지 않으면 헤메게 됨으로 구조를 머리속에 그리면서 코드를 따라가시면 쉽게 소스를 읽어 갈수 있습니다.
Form 1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | 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 _14.Override_Overload { public partial class Form1 : Form { COneCycle _cOC; // 외발 자전거 Class CCycle _cC; // 자전거 Class CCar _cCar; // 자동차 Class /// <summary> /// 프로그램의 진입점 입니다. /// </summary> public Form1() { InitializeComponent(); } /// <summary> /// Form Load Event /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load(object sender, EventArgs e) { _cOC = new COneCycle("외발 자전거"); _cC = new CCycle("자전거"); _cCar = new CCar("자동차"); } /// <summary> /// Form1에 대해 Key Down Event를 받아 옵니다. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if (e.KeyCode == Keys.Q) // Q Key가 눌러 졌으면 { fMoveing(-5); } else if(e.KeyCode == Keys.W) // W Key가 눌러 졌으면 { fMoveing(5); } } /// <summary> /// 화면에서 "외발 자전거" Button을 Click 했을 때 Event를 발생 시킵니다. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnOneCycle_Click(object sender, EventArgs e) { fClearPanel(); fOneCycleDraw(); } /// <summary> /// 화면에서 "자전거" Button을 Click 했을 때 Event를 발생 시킵니다. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnCycle_Click(object sender, EventArgs e) { fClearPanel(); fCycleDraw(); } /// <summary> /// 화면에서 "자동차" Button을 Click 했을 때 Event를 발생 시킵니다. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnCar_Click(object sender, EventArgs e) { fClearPanel(); fCarDraw(); } /// <summary> /// OneCycle 대한 위치 그림을 그려준다 /// </summary> private void fOneCycleDraw() { lblName.Text = _cOC.strName; Graphics g = pMain.CreateGraphics(); Pen p = _cOC.fPenInfo(Color.Bisque, 10); g.DrawRectangle(p, _cOC._rtSquare1); g.DrawEllipse(p, _cOC._rtCircle1); } /// <summary> /// Cycle 대한 위치 그림을 그려준다 /// </summary> private void fCycleDraw() { 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); } /// <summary> /// Car 대한 위치 그림을 그려준다 /// </summary> private void fCarDraw() { 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); } /// <summary> /// 화면에 그려진 그림을 지운다 /// </summary> private void fClearPanel() { pMain.Invalidate(); Refresh(); } /// <summary> /// 화면에서 "왼쪽 화살표" Button을 Click 했을 때 Event를 발생 시킵니다. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnLeft_Click(object sender, EventArgs e) { fMoveing(-5); } /// <summary> /// 화면에서 "오른쪽 화살표" Button을 Click 했을 때 Event를 발생 시킵니다. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnRight_Click(object sender, EventArgs e) { fMoveing(5); } /// <summary> /// 그려놓은 그림을 이동 시킵니다. /// </summary> /// <param name="iMove"></param> private void fMoveing(int iMove) { fClearPanel(); switch (lblName.Text) { case "외발 자전거": _cOC.fMove(iMove); fOneCycleDraw(); break; case "자전거": _cC.fMove(iMove); fCycleDraw(); break; case "자동차": _cCar.fMove(iMove); fCarDraw(); break; default: break; } } } } | cs |
CBase)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _14.Override_Overload { /// <summary> /// 기본 클래스 /// </summary> class CBase { public string strName; // 이름 protected Pen _Pen; // 펜 /// <summary> /// 생성자 /// </summary> public CBase() { _Pen = new Pen(Color.Aqua); } } } | cs |
COneCycle)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; namespace _14.Override_Overload { /// <summary> /// CBase를 상속 받은 외발 자전거 클래스 /// </summary> class COneCycle : CBase { public Rectangle _rtCircle1; // 바퀴1 public Rectangle _rtSquare1; // 몸통1 /// <summary> /// 생성자 /// </summary> /// <param name="sName"></param> public COneCycle(string sName) { strName = sName; // 클래스를 생성 할 때 이름을 가져와서 strName에 넣어 줌 _Pen = new Pen(Color.WhiteSmoke, 3); // 펜에 대한 색상과 굵기를 설정 _rtCircle1 = new Rectangle(120, 150, 120, 120); // 바퀴1에 대한 위치 및 크기를 설정 _rtSquare1 = new Rectangle(150, 30, 60, 120); // 몸통1에 대한 위치 및 크기를 설정 } /// <summary> /// 외부에서 그림의 위치를 이동시키는 함수를 호출 /// </summary> /// <param name="iMove"></param> public virtual void fMove(int iMove) { fCircle1Move(iMove); fSquare1Move(iMove); } /// <summary> /// 바퀴1의 위치를 가져와서 X 위치값을 이동 시키고 다시 바퀴1에 위치 정보를 넣어줌 /// </summary> /// <param name="iMove"></param> protected void fCircle1Move(int iMove) { Point oPoint = _rtCircle1.Location; oPoint.X = oPoint.X + iMove; _rtCircle1.Location = oPoint; } /// <summary> /// 몸통1의 위치를 가져와서 X 위치값을 이동 시키고 다시 바퀴1에 위치 정보를 넣어줌 /// </summary> /// <param name="iMove"></param> protected void fSquare1Move(int iMove) { Point oPoint = _rtSquare1.Location; oPoint.X = oPoint.X + iMove; _rtSquare1.Location = oPoint; } /// <summary> /// 설정 되어 있는 Pen에 대한 정보를 반환 /// </summary> /// <returns></returns> public Pen fPenInfo() { //_Pen = new Pen(Color.White, 3); return _Pen; } /// <summary> /// Pen에 대한 색상을 설정 하고 Pen 정보를 반환 /// </summary> /// <param name="oColor">색상</param> /// <returns></returns> public Pen fPenInfo(Color oColor) { _Pen = new Pen(oColor); return _Pen; } /// <summary> /// Pen에 대한 색상및 두께를 설정 하고 Pen 정보를 반환 /// </summary> /// <param name="oColor">색상</param> /// <param name="iWidth">두께</param> /// <returns></returns> public Pen fPenInfo(Color oColor, int iWidth) { _Pen = new Pen(oColor, iWidth); return _Pen; } } } | cs |
CCycle)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; namespace _14.Override_Overload { class CCycle : COneCycle { public Rectangle _rtCircle2; // 바퀴2 /// <summary> /// 생성자 /// </summary> /// <param name="sName"></param> public CCycle(string sName) : base(sName) { strName = sName; // 클래스를 생성 할 때 이름을 가져와서 strName에 넣어 줌 _Pen = new Pen(Color.Black, 3); // 펜에 대한 색상과 굵기를 설정 _rtCircle1 = new Rectangle(30, 150, 120, 120); // 바퀴1에 대한 위치 및 크기를 설정 _rtCircle2 = new Rectangle(210, 150, 120, 120); // 바퀴2에 대한 위치 및 크기를 설정 _rtSquare1 = new Rectangle(60, 90, 240, 60); // 몸통1에 대한 위치 및 크기를 설정 } /// <summary> /// 외부에서 그림의 위치를 이동시키는 함수를 호출 /// </summary> /// <param name="iMove"></param> public override void fMove(int iMove) { base.fMove(iMove); fCircle2Move(iMove); } /// <summary> /// 바퀴2의 위치를 가져와서 X 위치값을 이동 시키고 다시 바퀴1에 위치 정보를 넣어줌 /// </summary> /// <param name="iMove"></param> protected void fCircle2Move(int iMove) { Point oPoint = _rtCircle2.Location; oPoint.X = oPoint.X + iMove; _rtCircle2.Location = oPoint; } } } | cs |
CCar)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; namespace _14.Override_Overload { class CCar : CCycle { public Rectangle _rtSquare2; // 몸통2 /// <summary> /// 생성자 : 상속받은 CCycle의 생성자를 가져옴 /// </summary> /// <param name="sName"></param> public CCar(string sName) : base(sName) { strName = sName; // 클래스를 생성 할 때 이름을 가져와서 strName에 넣어 줌 _Pen = new Pen(Color.Blue, 3); // 펜에 대한 색상과 굵기를 설정 _rtCircle1 = new Rectangle(60, 180, 90, 90); // 바퀴1에 대한 위치 및 크기를 설정 _rtCircle2 = new Rectangle(210, 180, 90, 90); // 바퀴2에 대한 위치 및 크기를 설정 _rtSquare1 = new Rectangle(90, 30, 180, 90); // 몸통1에 대한 위치 및 크기를 설정 _rtSquare2 = new Rectangle(30, 120, 300, 60); // 몸통2에 대한 위치 및 크기를 설정 } /// <summary> /// 외부에서 그림의 위치를 이동시키는 함수를 호출 (상속받은 함수 중 같은 함수가 있기 때문에 new로 생성) /// </summary> /// <param name="iMove"></param> public override void fMove(int iMove) { base.fMove(iMove); //fCircle1Move(iMove); //fCircle2Move(iMove); //fSquare1Move(iMove); fSquare2Move(iMove); } /// <summary> /// 몸통2의 위치를 가져와서 X 위치값을 이동 시키고 다시 바퀴1에 위치 정보를 넣어줌 /// </summary> /// <param name="iMove"></param> protected void fSquare2Move(int iMove) { Point oPoint = _rtSquare2.Location; oPoint.X = oPoint.X + iMove; _rtSquare2.Location = oPoint; } } } | cs |
'C# > C# 강좌 Winform' 카테고리의 다른 글
Doridori C# 강의) 16. StreamReader, StreamWriter (24) | 2018.09.09 |
---|---|
Doridori C# 강의) 15. 캡슐화( Encapsulation)와 Partial Class (20) | 2018.08.20 |
Doridori C# 강의) 13.상속(Inheritance) 및 접근제어 (18) | 2018.08.05 |
Doridori C# 강의) 12.클래스의 생성 및 사용(Class) (10) | 2018.07.30 |
Doridori C# 강의) 11.구조체와 클래스(Struct, Class) (17) | 2018.07.22 |
- Total
- Today
- Yesterday
- C# 강좌
- 가볼만한곳
- 칵테일
- 도리도리 C#
- 술
- 와인
- 서울
- 전통주
- 주말
- 맥주
- 위스키
- 광저우
- 게임
- C# 기초 강의
- C#
- 도리도리
- 증류주
- 하이볼
- 소주
- 가볼만한 곳
- 모바일
- 프로그램 강의
- C# 강의
- WinForm
- 막걸리
- 나들이
- Visual Studio
- 아이랑
- 맛집
- 보드카
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |