-
Notifications
You must be signed in to change notification settings - Fork 10
/
0410.txt
233 lines (233 loc) · 11.2 KB
/
0410.txt
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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
예 안녕하세요. 포프입니다.
OOP 하시는 분들 중에
"다중 상속" 이런 얘기를..
들어보신 분들이 요즘 얼마나 될지 모르겠어요
다중 상속 자체를 이제 허용하지 않는 언어가 워낙 많아지다 보니까
처음에 이제 OOP쪽 나올 때는
다중 상속이 허용되는 언어들이 있었어요
대표적인 것이 C++이 그랬고
다중 상속을 허용하지 않는 언어들은
C#이나 JAVA 이런 쪽은
다중 상속이 정 필요하면 다중 상속이 아니라
인터페이스 개념으로 가서
기능을 거기에서 만드는 것으로 하거나
(정확히 말하면 상속은 아니죠)
아니면
음..
컴포넌트 기관으로 가거나 이런 이야기를 해요
다중 상속의 말도 안되는 문제점들이 보였고
당연히 개념적으로 나쁘지는 않은건데
현실에서 그렇게 쉽게
생각할 수 있는 다중 상속의 개념들이 별로 없었기 때문에
그런 부분 이였던 것 같아요
근데,
다중 상속 여기서 이제
이게 왜 안 좋고 좋고
그게 주제가 아니라
다중 상속이 되고, 안 되는 언어들을 보다보면
약간 재미있는 언어상의 패턴이 보이기 시작해요
그거에 대해 이야기해보려고 해요
상속을 받는 경우에는
보통 클래스에 생성자가 있잖아요
생성자의 개념도 잘 못 잡고 있는 사람들이 점점 많아지는 것 같긴 해요
아무래도
OOP쪽 개발이 한참 흥 하다가
요즘은 이제 OOP를 완전히 걷어내고
데이터 오리엔트 디자인 비슷하게 다가가고 있는 것이 문제인 것 같아요
기호 개념이고, 자바스크립트 개념이고
자바스크립트 자체에서 아예 OOP가 없기 때문에 그렇기도 하겠지만,
특히 웹 기반 쪽으로 그냥
세터 게터나 프로퍼티에 직접
데이터를 박는 게 되게 일반화 되고,
그렇기 때문에 어떤 오브젝트가 생성이 됐을 때
올바른 데이터가 설정이 돼있고,
이 오브젝트가 사라질 때
모두 클린업이 된다는 사실을 잘 못잡는 사람이 많은 것 같고
요즘 그런 코드가 나오고 있는 걸 봐요
걱정이 되는 부분이기도 한데,
어쨌든 기본적으로 개념이 뭐냐면
OOP에서 특히 중요한 개념이 뭐냐면
어떤 오브젝트를 만들었다, 클래스에서
인스턴스를 만들었다고도 하죠
이 오브젝트가 만들어지는 순간에 생성자가 있어서
이 생성자에서 특정 파라메터를 받아서
아니면 기본 생성자가 있어서
이따 오브젝트가 만들어지는 순간에 이미 완성된 오브젝트여야 한다
여기서 다른 속성을 바꿀 수는 있지만
그 생성이 된 순간에도 이미 완성이 된 오브젝트여야 한다는
기본.. 그런
규칙? 원칙을 지키는 게 맞는 것 같아요
이게 인캡슐레이션이기도 하겠고
정확히 OOP 언어로는 정확히 뭔지 모르겠어요
저는 그렇게 이해를 하고 말을 보통 해요
그럼 재미있는건
상속을 받은 오브젝트는 어떻게 되느냐 그러면
여기도 개념이 헷갈리는 사람을 요즘 많이 보고 있는데
특히 학생 쪽에서
예를 들어서 보통 애니멀
뭐 동물 개
이런 식으로 말을 하잖아요
애니멀이라는 부모 클래스가 있고
거기에 강아지, puppy, 개, dog
뭐 이런 게 있다고 해요
애니멀과 독이 이렇게
부모 자식 관계로 있어요
그러면, dog를 만지는 순간에
dog은
자기에 관련된 프로퍼티 멤버변수만
초기화를 하면 되는 거에요
그러고
이게 만약에 애니멀에서 초기화 되어야 하는 내용들이 있잖아요
프로퍼티라는건
그거는, dog의 생성자에서
애니멀의 생성자를 호출해서 패러미터를 제대로 넣어 주면
아, 그건 애니멀이라서 이 부분을 만들어 줄 거야
단 dog은 내가 멤버로 가지고 있는 멤버. 추가로 가지고 있는 멤버만 초기화 해주면 되는 거에요
뭐, 당연히 지울 때도 똑같은 개념이고
그래서 이걸 생각하면
보통 OOP 시험에 많이 나와요
dog을 만들 때
어떤 생성자가 먼저 호출이 되냐
어쩔 수 없이 애니멀이 먼저 호출될 수 밖에 없어요
애니멀이 부모이기 때문에
메모리 구조 상도 얘네가 먼저고
그러면 얘(1)가 초기화가 되고,
그 다음에 얘(2)가 초기화가 되는 과정을 가야 정상인 거에요
지울 때는 그냥 그 반대고
이것만 이해해도 그 시험 문제는 맞아요
그런데, 재미있는 게
여기서 제가 하려던 이야기가 뭐냐면
C++을 한 사람들이 요즘 얼마나 많을지 모르겠지만
내가 dog에서 애니멀 생성자를 호출하려고 할 때 어떻게 하느냐,
그리고 java 계열이라던가
C# 계열을 한 사람들은 어떻게 호출해야 되느냐
그것을 얘기할 수 밖에 없죠
java나 C# 쪽을 먼저 얘기하자면
자바에서는 super라고 호출을 해요
내가 dog이고 부모 생성자를 호출하려고 하면
아니면, 부모의 멤버 변수, 함수를 호출하려고 하면
언제나 super를 써요 왜냐하면 걔(부모)는 내 위에 있으니까
부모님은 위대하신 분이죠!
그러면, 위에 있으니까 슈퍼 어쩌구를 써요
그러면 자바는 음... 뭐라그럴까
부모님의 존경을 보여주는 언어라면
C#은 base를 써요
나는 여기있고, 내 기반이 된 사람은 누구냐
부모님이 나를 낳아줬으니까, 내 기반으로 가서
기반의 생성자를 호출하거나, 기반의 멤버를 호출하거나
이런 식으로 말이죠
그래서 java나 C#이나
특정한 키워드가 있어요
내 부모를 호출하는
그런 키워드가
C++에 가면 얘네는 좀 패륜아거든
그래서 C++은 super나 base가 없어요
뭐라고 하냐면, 내가 dog이잖아요
그러면 내 부모가 애니멀이였잖아요
그러면 그냥 내 부모의 이름을 불러요, 애니멀
그러면 얘네는 부모 생성자를 호출할 때
super, base 대신에 그냥 애니멀을 놓고
매개변수를 넣어요
부모 클래스 이름을 넣는거에요
C하고 C++은
아, C++이죠
C++은 패륜적이고
자바는 부모님에 대한 공경이 크고
C#은 내가 어디서 왔는지.. 원천?
소스를 잘 아는 그런 언어인데
그럼 왜 귀찮게 C++은 키워드 하나 만들고
이런걸로 했어요? 라는 사람을 제가 봤어요
이유는 하나에요
처음에 말했던 것
다중상속이 되기 때문이에요
그니까 예를 들어서
저는 dog를 만드는데
애니멀에서 상속을 받으면서
동시에 식물에서 상속을 받을 수도 있어
애니멀하고 플랜트하고 들어오거든?
그럼 dog를 만드는 순간에 애니멀의 생성자도 호출해야하고
플랜트의 생성자도 호출해야해요
그러면 제가 단순히 super라고 묻는 것 만으로는
누구를 가리키는지 헷갈리게 되거든요
그래서 어쩔 수 없이 부모를 이름으로 불러야 되는 거에요
최근에 그런 질문을 듣다 보니까
제가 학생에게 들었던 질문인 것 같은데
아 저는 지금까지 당연히 그냥 뭐..
언어가 그런가보지 하고 썼는데
C++에서 super나 base를 쓰는 순간 쓸 수 있는 방법이 없는 거에요
이건.. 그래서 그렇게 돌고 있구나
여태까지 이걸 하시면서 궁금하셨던 분들은
아 C++은 왜 그렇게 불편해
라고 생각하셨던 분들은
그냥 C++은
더 굉장히 다양한 이상한 것들을 지원하기 때문에
그 다양한 이상한 것들을 지원하기 위해 이런 게 있는 거에요
그러나 요즘 사람들이 C++을 쓴다면
다중 상속을 거의 안쓰겠죠
인터페이스 기반으로 돌거나
C++에서 인터페이스라는 개념 자체가 없기 때문에
클래스로 만들어야 하지만
인터페이스 기반으로 돌리다 보면
인터페이스를 제외한 유일한 클래스는
딱 하나밖에 없을 거니까 super나 base가 들어와도 말은 되겠죠
뭐.. 그건 언어적인 한계이고 현재로서
그렇게 지금 되어 있어요
C++이나 이런 것을 해본 분들은 아시겠지만
java에서 못하던 것들은 C++에서 엄청나게 할 수 있는 것들이 많고요
C#에서 못하던 것들이 C++에서는 할 수 있는 것들이 있어요
꽤 있어요. 엄청나게 까지는 아니고
그러면 그런 부분에서 지원을 했었기 때문에
아직도 하기 때문에
이런 이상한 것들이 많은 거에요
제가 또 이 비디오를 만드는 이유가 뭐냐면
C#쪽에서 제가 그런 얘기를 들었어요
다중 상속을 지원하게 하려고 이런저런 시험을 해보고 있데요
정식으로 들어올지 안 들어올지는 모르겠지만
그래서 그것을 익스텐션으로 하던지 이상한 짓을 하는 것 같은데
제발 안 그랬으면 좋겠다는 생각을 해요 사실은
다중 상속을 잘 쓰면 좋은 곳이 있을 수도 있겠지만
개인적으로 그게 정말 필요한 경우를 못봤거든요
다른 방식으로 다 끝낼 수 있었고
크게 문제가 없었기 때문에
그리고 예전에도 제가 OOP 얘기 했을 때
깊은 상속.. 그냥.. 뭐
할아버지 증조부터 내려오는 상속 4단계를 거치는 일이라던가
여러 개가 뭉쳐서 상속 받는 그런 구조 자체가
많이 안 쓴다 이제
실제 존재하는 클래스의 대부분이 상속받지 않고 있고
몇 가지만 상속을 받는다 이렇게 이야기했죠
그런 의미에서 이제 또
사담이지만, C#같은 경우에
아니면 java같은 경우에
더 이상 클래스에 추가 상속을 받지 못하게 하려면
붙이는 키워드가 있어요
C#은 실드(sealed)라는 것을 붙이는 것 같고
java는 파이널(final)이라는 것을 붙이는 것 같아요
제가 정확히 기억이 잘 안나요 java쪽은
C#은 실드(sealed)라는 것을 붙이게 되어 있어요
그러면 상속 받으려 하면 컴파일 에러나거든요
그런데 요즘 사람들이 클래스 쓰는 모습을 보면
실드 클래스 자체가 기본적으로 상속이 안 되야 하고
내가 상속을 하고 싶어 하는 클래스가 있다면
거기다 새로운 키워드를 붙이는 게
정상이고 올바른 것 같아요
그게 올바른 기본 동작인 것 같고
그 부분도 제가 큰 문제는 아닌데
코드 리뷰 보면서 항상 하는 이야기거든요
"야 이거 클래스 상속 더 이상 안받을 거잖아 실드 붙여"
이거를.. 구지 왜 따로 붙여야 하는지는.. 귀찮죠
사람들이 까먹는거죠
그런 것도 있어요
그래서 오늘 원래 하려고 했던 이야기는
C++에서는 부모 생성자를 부를 때
버릇 없이 부모 이름을 부르는데,
C#과 java는 super나 base로 부르냐,
그거에 대한 대답을 하려 했던 거고
그거에 곁가지로 다양한 얘기가 들어왔죠
상속이라던가 기타 등등.. 다중 상속..
뭐 그래도
그리고 10분 채웠으니까
주저리 주저리 말이 많은 것 같아요
오늘은 그 정도로 끝낼 거에요
할 말이 없어요 끊을게요
포프였습니다