티스토리 뷰
======================================================
안녕하세요 Doridori 입니다.
이번강의는 상속과 접근제어에 대해서 강의 하도록 하겠습니다.
클래스를 생성 했다고 한다면 이제 클래스를 사용하는 이유에 대해서 알 필요가 있을 것 같습니다.
상속이 많아 질수록 소스를 따라가면서 분석하기에는 점점 지저분해 지기는 하지만 확실히 소스의 재사용이나 확장 관련 된 부분은 엄청난 도움이 되는것 같습니다.
클래스를 만들어서 상속을 하면서 부터는 프로그램의 구조를 파악하면서 진행 해야 헤메지 않게 되는데 처음에는 흡사 미로를 돌아다니는 느낌을 받게 됩니다.
천천히 따라가면서 풀다 보면 어느샌가 아무 생각 없이 상속받은 부모클래스를 찾고 있는 본인을 발견하게 됩니다.
여럽지 않으니 천천히 집중해서 여러번 보면 많은 도움이 될것이라고 생각 합니다.
======================================================
상속 및 접근제어
Source UI) Study_13_Inheritance(UI).zip
Soruce 전체) Study_13_Inheritance.zip
교재) 13강 상속(Inheritance)과 접근제어.pdf
상속의 경우는 간단하게 부모에서 선언해 놓은 내용을 자식이 약간만 건드려서 가져다 쓰겠다 라고 생각 하시면 됩니다.
처음부터 적을려고 하니 귀찮고 똑같은것을 여러번 만들려고 하니 나중에 수정하게 되면 수정 할 곳이 너무 많고 할때 상속을 잘 사용 하면 한곳만 수정 해서 원하는 결과를 얻을 수 있게 됩니다.
접근제어의 경우 기본적으로 아래와 같이 사용 되는데 (많이 사용되는것 기준)
Pulbic : 클래스 외부나 자식 클래스에서 부모 클래스 인자나 함수들을 접근 가능
Protected : 클래스 외부에서는 접근 불가, 자식 클래스에서는 접근 가능
Private : 클래스 외부나 자식클래스에서 접근 불가 (클래스 자기 자신 내부에서만 접근 가능)
(표를 만들어서 PDF에 넣었어야 했나?? 싶네요; 강의에 설명해 두었습니다. ^^ 강의 봐주세요 ^^;;)
상속과 함께 보아야 이해가 되는 부분이라서 이번강의 까지 아껴(미뤄 =0=;;)두었습니다.
(그림을 그리기 위해서 좌표점을 찾기 위한 그림을 그려 보았습니다.)
이번강의 UI는 간단합니다. (Panel 내부에다 그릴꺼라서 =0=;; ㅎㅎ)
실제로 저는 실무에서는 (제가 일하는 분야 한정 일수 있습니다.) 거의 사용하지 않지만 책에도 자주 나오고 그림 그리는 예제는 한번은 다루고 넘어가는것도 나쁘지 않을 것 같아서 이번에 상속관련 된 부분을 강의할때 많이 나오는 예제를 구현 해 보았습니다.
원래 구조는 CBase -> COneCycle -> CCycle -> CCar 순서로 상속을 받으려고 했으나 CBase를 기준으로 여러 자식 클래스를 만들 수 있다고 보여드리기 위해서 일부러 CBase를 부모로 한 자식 클래스를 두개 만들었습니다.
지금 생각해보니
CBase -> COneCycle -> CCycle
CBase -> CCar
이런식으로 상속을 받았으면 더 자연스럽지 않았을까 싶기도 합니다.
(복습 하실때 위의 구조처럼 만들어 보셔도 될것 같습니다. ^^)
이번에 클래스를 분리해서 많이 많들다 보니 소스가 길어져서 강의를 먼저 올렸습니다.
요즘 강의를 만들다 보니 계속 강의가 길어져서 이번에도 두개로 분리하였습니다.
(그래도 한주에 다 올렸습니다. ^^ 아자아자!!)
강의)
상속 및 접근제어 (1)
상속 및 접근제어 (2)
Source)
Form1)
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 | 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 _13.Inheritance { 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> /// 화면에서 "외발 자전거" 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(); 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(); 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(); 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) { fClearPanel(); switch (lblName.Text) { case "외발 자전거": _cOC.fMove(-5); fOneCycleDraw(); break; case "자전거": _cC.fMove(-5); fCycleDraw(); break; case "자동차": _cCar.fMove(-5); fCarDraw(); break; default: break; } } /// <summary> /// 화면에서 "오른쪽 화살표" Button을 Click 했을 때 Event를 발생 시킵니다. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnRight_Click(object sender, EventArgs e) { fClearPanel(); switch (lblName.Text) { case "외발 자전거": _cOC.fMove(5); fOneCycleDraw(); break; case "자전거": _cC.fMove(5); fCycleDraw(); break; case "자동차": _cCar.fMove(5); 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 _13.Inheritance { /// <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 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; namespace _13.Inheritance { /// <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> /// 설정 되어 있는 Pen에 대한 정보를 반환 /// </summary> /// <returns></returns> public Pen fPenInfo() { //_Pen = new Pen(Color.White, 3); return _Pen; } /// <summary> /// 외부에서 그림의 위치를 이동시키는 함수를 호출 /// </summary> /// <param name="iMove"></param> public 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; } } } | 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 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 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; namespace _13.Inheritance { class CCycle : CBase { public Rectangle _rtCircle1; // 바퀴1 public Rectangle _rtCircle2; // 바퀴2 public Rectangle _rtSquare1; // 몸통1 /// <summary> /// 생성자 /// </summary> /// <param name="sName"></param> public CCycle(string 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> /// 설정 되어 있는 Pen에 대한 정보를 반환 /// </summary> /// <returns></returns> public Pen fPenInfo() { return _Pen; } /// <summary> /// 외부에서 그림의 위치를 이동시키는 함수를 호출 /// </summary> /// <param name="iMove"></param> public void fMove(int iMove) { fCircle1Move(iMove); fCircle2Move(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> /// 바퀴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; } /// <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; } } } | 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 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; namespace _13.Inheritance { 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 new void fMove(int 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# 강의) 15. 캡슐화( Encapsulation)와 Partial Class (20) | 2018.08.20 |
---|---|
Doridori C# 강의) 14. 오버라이딩(Override)과 오버로딩(Overload) (6) | 2018.08.12 |
Doridori C# 강의) 12.클래스의 생성 및 사용(Class) (10) | 2018.07.30 |
Doridori C# 강의) 11.구조체와 클래스(Struct, Class) (17) | 2018.07.22 |
Doridori C# 강의) 10.반복문2(while, do while) (27) | 2018.07.15 |
- Total
- Today
- Yesterday
- 술
- 맥주
- Visual Studio
- 위스키
- 주말
- C# 강좌
- 막걸리
- 광저우
- 아이랑
- 보드카
- 도리도리 C#
- C#
- 칵테일
- 게임
- 서울
- 소주
- 프로그램 강의
- 모바일
- 가볼만한곳
- 와인
- 맛집
- 하이볼
- 나들이
- 전통주
- C# 기초 강의
- WinForm
- 가볼만한 곳
- 도리도리
- C# 강의
- 증류주
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |