-
Notifications
You must be signed in to change notification settings - Fork 10
/
0366.txt
229 lines (229 loc) · 11.2 KB
/
0366.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
예 안녕하세요 포프입니다
또 계속되는 코딩 스탠다드(coding standard)
이야기에요
왜 이렇게 코딩 스탠다드(coding standard)
이야기를 많이 하냐
제가 요번 학기에 C++을 가르치고 있기 때문에
C++은 한 80%는 쓰지 말아야 하는 언어 기능들이
되게 많잖아요
그리고 되게 C하고 비슷한 거, 중첩되는 것들도 있고
그래서 그런 부분에서
이거는 업계에서는 요즘 코딩 스탠다드(coding standard)를 이렇게 써 갖고
좀 더 안전하게 쓸려고 한다
라는 걸 알켜줄 수밖에 없어요
C++이 워낙 위험한 언어기 땜에
그래서 그거를 정리하다가
계속 주제가 나오기 때문에 만드는 거야
오늘은 C++에 한정된 얘기죠 당연히
struct(구조체)와 class(클래스)의 차이?
여태까지 코딩 스탠다드(coding standard) 비디오
보신 분들은 알겠지만
제가 쓰는 코딩 스탠다드(coding standard)가
공개돼 있어요
그 링크를 여태까지 걸었으니까 오늘도 걸어야지
걸게요
C# 코딩 스탠다드(coding standard)도 같이 걸죠 뭐
필요는 없지만 이 비디오에서
struct(구조체)와 class(클래스) 차이가 뭐냐
일단 C를 하신 분들은
struct(구조체)가 뭔지는 아실 거에요, 그죠?
struct가 structure의 약자인데,
데이타 멤버(data member)들을
오밀조밀하게 모아 놓은 거죠
integer하나만 뽑기 보다는,
integer도 있고 float도 있고 char array도 있을 거야
그럼 이 모든 걸 모아서
struct(구조체) 안에 곱게 박아 두고
struct(구조체)를 꼭 이게
변수 하나인 것처럼, 변수죠 사실
패스(pass)해 가면서
아니면 포인터(pointer)로 패스(pass)해 가면서
거기에서 값 넣고 값 빼고
OOP* 개념에서
(*Object-Oriented Programming, 객체 지향 프로그래밍)
메서드(method) 빼고,
멤버 함수(member function) 그거 빼고
순수하게 데이터(data)만 있는 그런 구조가
구조체, structure죠, struct
그리고 당연히 C는 OOP*의 개념이 없었기 땜에
(*Object-Oriented Programming, 객체 지향 프로그래밍)
여기에 Access Modifier(액세스 한정자)가 없죠
모두가 다 public이에요
struct(구조체)가 있으면 접근할 수 있다 그게 시작이죠
그럼 class(클래스)는 뭐냐
OOP* 언어에서 쓰는 class(클래스) 있잖아요
(*Object-Oriented Programming, 객체 지향 프로그래밍)
struct, 멤버 변수(member variable) 있고
그 멤버 변수(member variable)에서
어떤 거는 public으로 보일 수도 있고,
어떤 건 public으론 안 보일 수도 있고
그리고 거기다 메서드(method) 올려 놓은 거
그렇게 생각하면 맞죠
재밌는 게 뭐냐면
제가 강의를 하면서 되게 강조를 하는 건데
야, 그러면 struct(구조체)하고 class(클래스)가 있는데
과연, 컴퓨터..
그니까 머신까지 가면은,
그니까 assembly(어셈블리) 컴파일(compile)하고 뭐
기계어 컴파일(compile)하면
야, 과연 컴퓨터한테는 이 둘이 차이가 있을까?
라는 걸 물어봐요
차이가 있을까요?
좀 뜸을 들여야지 대답하실 수 있게
여기서 차이가 있다고 말씀하신 분들은
틀렸어요
차이가 없어요
C가 완벽히 기계어랑 1:1매칭을 하는 언어는 아니지만
되게 가까운 언어 중의 하나에요 사실은
그러면 C에 존재하지 않는 거면은
기계에 존재하지 않는다고 보시면 맞아요
그래서, C에 존재하지 않았는데
C++에서 class(클래스)가 생겼어!
그러면 class(클래스)는 존재하지 않는 거에요
기계 쪽에선
그럼 결과적으론 struct(구조체)가 있고 class(클래스)랑 되게 비슷하니까
기계가 볼 때도 struct(구조체)하고 class(클래스)를
되게 비슷하게 처리할 수밖에 없어요
특히 멤버 변수(member variable)에 관해서는
그러면 실제 C++에서 struct(구조체)하고 class(클래스)를 쓸 때도 제한이 있다면
그거는 컴파일러(compiler)가 제약하는 거죠
컴파일(compile) 도중에, 야, 이거 너는 잘못했어
이러면 안 돼. 컴파일(compile)도 안 할 거야
이런 식으로,
실행 중에 생기는 문제가 아니라
근데 재밌는 거는
C++에서 struct(구조체)에 별별 걸 다 할 수 있어요
멤버(member)를 private으로 바꿀 수도 있고
거기에 함수(function)를 추가할 수도 있고
거의 class(클래스)랑 비슷해요
물론 기본 동작은 약간 달라지는 게 있어요
그것까지 굳이 말하진 않을 거고
그니까 기본 Access Modifier(액세스 한정자)가
조금 달라요
말하자 말하자
class(클래스)에서는 앞에 public, private 이런 거
안 넣으면 default로 private이에요
struct(구조체)는 public, private 이런 거
안 넣으면 default로 public이에요
근데 요즘 쓰는 코딩 스탠다드(coding
standard)는 대부분 명시적으로 쓰라 그러죠
class(클래스)에서 private일지라도, 실제 private: 써주고
그 밑에 멤버 변수(member variable) 박아라
요즘은 그런 식으로 많이
코딩 스탠다드(coding standard)가 가고 있기 땜에
정말
struct(구조체)를 class(클래스)처럼 쓰는 사람도 많고 class(클래스)를 struct(구조체)처럼 쓰는 사람도 많아요
결과적으로는 컴파일러(compiler)가 체크하는 게 조금 다를 뿐이지 내부적으론 거의 똑같다고 봐도 맞거든요
뭐 이제 약간 자잘하게 다른 건 있어요
근데 뭐 그거 그렇게 중요한 건 아니고
그러면 과연
어디다 class(클래스)를 쓰고 어디다 struct(구조체)를 써야 되냐 이런 질문이 나올 수밖에 없어요
그러면 이거는 코딩 스탠다드(coding
standard)로 해결할 문제에요
간단하게 룰을 말해주면은
object(객체)를 만들고 함수(function)를 추가할 때
그니까 멤버 함수(member function),
또 누가 딴지걸 것 같은데, 메소드(method)라고도 하죠
멤버 함수(member function)를 추가할 때는
당연히 class(클래스)를 써야 된다
structure(구조체)는
둘째라고 해야 돼
둘째, structure(구조체)는
C스타일의 structure(구조체)에만 쓴다
그니까 한마디로 뭐냐면
Plain Old Data(POD)라고 하거든요
아무것도 없고
Constructor도 없고 Destructor도 없고, 생성자, 파괴자요
함수(function) 아무것도 없고
그냥 말 그대로
데이타(data)만 딱 모아 놓은 것만 struct(구조체)로 하자
왜냐면 그 데이타(data)를 패스(pass)할 일이 있어요
순수하게 데이타(data)만 있는 경우도 있기 때문에
왜?
그래야만 남들이 코드를 볼 때도 안 헷갈린다는 거죠
특히 제가 말했던 Plain Old Data(POD)의 장점은 뭐냐면
assignment(대입)할 때 있잖아요
그니까
structure(구조체)를 가지고,
포인터(pointer)말고
진짜 structure object(구조체 객체)
다른 structure object(구조체 객체)에
assign(대입)을 할 때
assignment operator가,
대입 연사자가 존재하지 않는 경우 있잖아요
그럼 기본적으로
얘를 거의 memcpy 하듯이 copy(복사)를 해요
그냥 똑같이 있는,
그니까, 얘네가 12바이트(byte)고
얘가 12바이트(byte)였다면
12바이트(byte)를 그냥 갖다 복사하는 느낌으로
거의 해요
그게 Plain Old Data(POD)의 장점이죠
그냥 대입만 해도 문제가 없다
왜냐면 내부적으로 dynamic하게 memory allocation
(동적 메모리 할당)된 것도 없고
object(객체) 안에서 memory(메모리)를
지워줄 것도 없으니까, 파괴 중에.
그러면은 struct(구조체)를 보는 순간
모든 struct(구조체)는 그냥 assignment(대입)를 해도
상관이 없구나라는 걸 느낄 수가 있는 거죠
근데 class(클래스)가 나왔으면은
class(클래스)는 당연히 이제
constructor(생성자)와 destructor(파괴자)도 있고
그리고 memory allocation(메모리 할당)
내부적으로 생기기 땜에
그냥 기본적으로 대입을 하는 걸론 안 된다
그러면 class(클래스)를 만들 때는 내부적으로
memory allocation(메모리 할당)이 있을 때 그때는
assignment operator(대입 연산자) 만들어 주고
copy constructor(복사 생성자) 만들어주고
그래야 한다라는 걸 알 수가 있는 거죠
그래서 그냥 structure면은 무조건 순수한 데이터(data)다라고 코딩 스탠다드(coding standard)를 강요하다 보면은
나중에 코드를 짤 때 아 이게 memory(메모리)가 왜 새지 않나라는 거를 고민할 이유가 적어진다는 거에요
어찌 보면은,
제가 볼 때는 그냥
C++을 처음 만들 때, struct(구조체)가 이렇게 이 꼴이 되도록 만든 것 자체가 큰 실수라고 보는데
뭐, 이유가 있을 순 있죠
제가 읽었는데도 까먹었을 수도 있고
근데 현재 그 이유가 존재하는 부분을 제대로 쓰고 있는 게 없다고 저는 생각을 하기 때문에, 업계에서도.
그냥 코딩 스탠다드(coding standard)에서
struct(구조체)는 함수(function)가 없는 것
그냥 순수하게 데이터(data)만 있고 모두가 public인 것
그리고 class(클래스)는 다 존재하는 것,
함수(function)까지.
그리고 private, public member
private, public member가 있다는 것 자체가 constructor(생성자)가 존재해야 되고 멤버 함수(member function)가 존재해야 되고 그 얘기잖아요
그렇게 생각을 하고 그렇게 써가는 게 좋을 것 같애요
이거를 강요를 하는 회사를
생각보다 많이 보지는 못했어요
아.. 한,
최근 들어서 비슷하게 하는
좀 되게 굉장히 큰 기업이 그렇게 하는 걸 봤고
그 전에 제가 예전에 있던 회사들에서는 이거를 이렇게
까탈스럽게 강요하는 경우는 보지는 못했었어요
그래서 이게 정말 업계 전체에서 통용되는 코딩 스탠다드(coding standard)다라고 말할 순 없지만
이렇게 코드를 짠다고 해서 누가 딴지
걸 사람은 절대 없을 것 같고
그니까 남들보다 좀 더
까탈스럽게 짜는 거죠, 어찌 보면은.
그리고 제가 볼 때는 업계의 한 20% 정도는
이 정도 standard를 쓰고 있다고 생각을 하고
한 20%만 쓰는 standard지만 굉장히 좋은 아이디어기 때문에 써 보도록 하세요라는 거에서,
struct(구조체)와 class(클래스)를 어떻게 쓰는 게 좋은가를 말씀을 드렸어요
정리하면 struct(구조체)는
순수 데이터(data) 언제나 public
아 그리고, struct(구조체)가 언제나 public이라고 하면은 struct에 public을 쓸 이유도 없어요
struct는 보이는 순간 그냥 public인 거야
class(클래스)를 만들 때만 private, protected, public
이런 거 신경써야 되는 거고
그래서
class(클래스)는 말 그대로
내부 함수(function) 있고 내부 멤버(member) 있을 때
그런 데 쓰는 게 class(클래스)
이렇게 정리하면 될 것 같아요
그럼 오늘도 이제,
즐거운 포프TV는 이만 끝내고
즐거우셨다면
구독 버튼을 눌러 주시면 됩니다
구독 구걸하기
포프였습니다