티스토리 뷰

======================================================

안녕하세요 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(120150120120);  // 바퀴1에 대한 위치 및 크기를 설정
            _rtSquare1 = new Rectangle(1503060120);  // 몸통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(30150120120);  // 바퀴1에 대한 위치 및 크기를 설정
            _rtCircle2 = new Rectangle(210150120120);  // 바퀴2에 대한 위치 및 크기를 설정
            _rtSquare1 = new Rectangle(609024060);  // 몸통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(601809090);  // 바퀴1에 대한 위치 및 크기를 설정
            _rtCircle2 = new Rectangle(2101809090);  // 바퀴2에 대한 위치 및 크기를 설정
            _rtSquare1 = new Rectangle(903018090);  // 몸통1에 대한 위치 및 크기를 설정
            _rtSquare2 = new Rectangle(3012030060);  // 몸통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


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함