C++ struct와 class의 차이?

이글루스 메인페이지는 안 간지가 너무 오래되어서.. 암튼 이런 글이 이오공감에 올라왔단다.

programmer 채용 인터뷰: http://nether.egloos.com/1802229

암울한 현실이 쭉 나오다가 몇몇 잘못된 댓글이 넘쳐나서 바로 잡기 위해 이렇게 쓴다.

 

1. "구조체와 클레스의 차이점을 물어보는건 어떠십니까.. 이거도 난해합니다 ㅋㅋ"

=> 뭐 어떻게 보면 고교시절 교과서 귀퉁이에 있는 자잘한 내용을 "요건 몰랐지!" 하면서 골탕먹이는 문제 같습니다만, 이건 좋은 문제입니다. 실제 쌀나라 회사에서도 C++ struct와 class 차이는 꽤 묻죠. 난해한 것은 아닙니다. 이걸 모르는 이유는 (1) C++을 오래 써보지 않아서 한번도 C++ struct의 특성을 접할 기회가 없었거나 (2) 아니면 C++ 공부를 깊게 할 기회가 없어서 입니다.

"구조체는 자료의 집합이고, 클레스는 자료만이 아닌 메소드(행동)도 같이 있는게 차이점이려나요?"

=> 아닙니다.

"구조체도 내부에 함수를 가질 수 있는 것으로 알고 있습니다.."

=> 맞습니다.

"구조체와 클래스가 틀린 것은 캡슐화가 가능하고, 상속 가능한 객체라는 점으로 알고 있습니다.."

=> 아닙니다.

설명: C++에서 class/struct는 struct의 기본 접근자가 public, 클래스는 private인 것을 빼고는 100% 동일합니다. C++ struct에 멤버 함수 다 넣을 수 있고 상속 받고 다 할 수 있습니다. 참고로 MFC의 CPoint class 정의를 보면 struct tagPOINT에서 상속 받음을 알 수 있습니다. 제가 이걸 보고 처음으로 C++ struct가 C struct와 다르다는 걸 알았습니다.

 

"클래스는 레퍼런스 타입이라서 Heap 영역에 자리잡고, 구조체(Struct)는 밸류 타입으로 Stack 영역에 자리잡는 것으로 알고 있습니다."

=> 완전히 아닙니다. 죄송하지만 도대체 누구한테서 이런 말도 안되는 소리를 들었습니까!!! 혹시 C#이나 자바와 헷갈리신건지!! (C#/Java struct/class가 어떤지는 잘 모릅니다.) C#의 struct/class 차이로 이는 C/C++에서는 전혀 적용되지 않습니다.

 

2. "현역 프로그래머 중 O() 가 무엇인지를 아는 사람은 극소수"

=> O()라고 써본적은 없는데.. 암튼.. Big-Oh 표기법을 모르는 사람이 정말 저렇게 많다는 것은 거짓말로 믿고 싶습니다. Big-Oh는 어떤 알고리즘의 Asymptotic upper bound이고 little-Oh는 정의에서 등호가 하나 빠져서 일종의 loose upper bound를 뜻합니다.

수학으로 표기를 해야하는데 말로 대충 쓰자면: f(n)이 O(g(n))이라는 소리는 충분히 큰 모든 n에 대해, f(n) <= c*g(n)을 만족하는 정수 c가 존재한다... 가 되겠습니다. o 표기는 여기서 <=를 <로 바꾸면 됩니다.

그러니까 O 표기 값은 f(n)보다 적어도 같거나 빠른 속도로 증가하면 되고, 반면 o는 반드시 더 빠른 속도로 증가해야 합니다. 예를 들어, 어떤 알고리즘이 {2n^2 + 3logn}이라면 O(n^2)이 됩니다. 당연히 O(n^3)도 되지만 별로 재미가 없죠. 그래서 tight bound라는 개념이 또 있는데, 대충 이런 경우 O(n^2)가 타이트 바운드가 되겠습니다. 반면, o(n^2)는 정의에 따라 절대 안 됩니다. 최소한 o(n^(2+epsilon)) 아니면 o(n^2 ln) 정도가 되어야겠죠.

 

"어느 알고리즘을 실행하여 결과를 내는데 최악의 경우를 가정했을 때 (가령 이미 정렬이 완료된 배열을 퀵소팅할 때와 같은)의 시간복잡도입니다."

=> 맞습니다. Upper bound가 바로 그것을 가리키죠.

"반대로 스몰-o는 최고 좋은 효율을 냈을 경우의 시간복잡도 이죠."

=> 아닙니다. 그렇게치면 퀵소트의 o 표기는 o(nlogn)이 되어야겠죠.

 

사실 Big O 표기가 항상 유용한 것은 아닙니다. 퀵소트, 머지소트 모두 평균 O(nlogn) 이지만 숨어있는 constant factor의 차이로 퀵소트가 대게 훨씬 빠릅니다. 그래도 이건 기본이... Big-Oh도 모르니 Master's theorem을 아는 사람은 더 없을 것 같군요.. 소팅에서 stable이 어떤 의미인지도 모르는 친구들도 태반일 것 같고... 아 잘난체 했는데 혹시 틀린게 있을까봐 겁납니다.

by object | 2008/09/07 12:52 | 컴퓨터 | 트랙백(1) | 덧글(32)
트랙백 주소 : http://minjang.egloos.com/tb/2049827
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from 그니 at 2010/03/24 17:08

제목 : C struct와 class의 차이?
C struct와 class의 차이?...more

Commented by 게드 at 2008/09/07 13:09
예전 사이냅에서 전화면접으로 나왔던 문제라 붇여뒀었습니다.. C와 C++의 구조체가 다르다면 질문 자체가 틀린거군요
Commented by object at 2008/09/07 14:49
예전에 재밌는 문제로 사람들 좀 골탕먹였던 사이냅... 이군요. ㅎㅎ
Commented by signer at 2008/09/07 13:13
음... 이젠 어디가서 댓글로 뭐달린거 읽기가 두렵습니다.
뭘믿고 공부하고 해야할지... 제대로된 책뿐인가요? ㅎㅎ
Commented by object at 2008/09/07 14:50
저는 일단 인터넷 정보는 안 믿고 봅니다. 광우병도.. ㅋㅋ
Commented by signer at 2008/09/09 22:44
-_-;;;
Commented by 엘센 at 2008/09/07 13:14
빅오, 빅오메가, 쎄타 표기법은 알았는데 스몰오는 처음 알았네요.
점근적상한에 대해선 보통 자료구조, 알고리즘때 중요하게 다루기 때문에 대부분 알지 않을까요?

C와 C++의 구조체가 다르다는 것은 처음 알았네요... 역시 프로그래밍을 안하다보니 간단한것도 놓치게 되는군요.
Commented by object at 2008/09/07 14:10
리틀오는 오히려 미적분학 책에서 자주 봤죠.... ㅋㅋ
Commented by 가이우스 at 2008/09/07 13:32
신경쓰지 않으면 은근히 쉽게 잊어먹는게 저런거라고 생각합니다..
(저런 비스므리한 질문을 받았다가 잘못 대답해서 교수님한테 혼났습니다.. ㅠ.ㅠ)
Commented by 가이우스 at 2008/09/07 13:59
여담으로 제일 답답했던 경우가
저런 개념을 쏼라쏼라 책에 있는 그대로 읊을 줄 아는 녀석이

막상 코딩 시작하니 손도 못데고 있더군요... 꽤 여러과목을 같이 듣고
같은 팀이 되었는데(같은 학년이기도 해서) 나중에는 자바스크립트도 손못데고
코딩은 책에 있는 것보고서나 할 줄 알지 조금만 바뀌면 버벅이고...
이런 녀석도 은근히 짜증나더군요.
Commented by object at 2008/09/07 14:10
컴공과 교수들 중에 컴퓨터 부품 제대로 주문해서 제대로 조립할 수 있는 사람 거의 없을 걸요.. ㅋ
Commented by 시즈하 at 2008/09/07 14:05
구조체와 클래스의 차이점은 C에서 C++로 넘어갈 때 C++에 새로 도입된 class의 개념을 설명하기 위해 나온 얘기라고 생각합니다. 하지만 정작 C++에서는 struct에 대한 정의 자체가 달라져 있는데, 책에서는 C의 struct와 C++의 struct의 차이에 대해서는 빠트렸거나 아님 대충 넘어갔거나 혹은 그 부분은 못 읽고 지나쳤거나 해서 그런 오해를 갖고 있는지도 모르겠습니다. 가르쳐 주는 쪽에서도 그냥 class를 쓰라고 하지 'C++의 struct는 이런 것도 되요...' 라고 알려주는 경우는 별로 없을 것 갈네요.
Commented by object at 2008/09/07 14:06
일단 C++ 21일 완성에는 나오지가 않습니다 :)
Commented by 게드 at 2008/09/07 14:08
21일 완성이 문제군요 <-
Commented by object at 2008/09/07 14:50
21일 완성 저는 좋아해요. 빠르게 맛을 보는덴 최고죠. 물론 거기서 끝내면 낭패.
Commented by object at 2008/09/07 14:54
저는 이걸 몰랐다고 "아 저 친구 C++ 공부 별로 안 했네" 이렇게는 절대 생각하지 않습니다. 아마 면접관들도저와 비슷한 생각을 하고 있을거에요. 이건 뭐랄까 C++에 대한 애정의 정도? 로 생각하면 좋을 것 같습니다. 그리고 언어 자체가 다소 struct/class를 모호하게 디자인한 것도 잘못이라고 봐야겠죠. 이래저래 C++은 learning curve가 무척이나 크고, 더욱더 큰 문제는 조금만 배워도 다 알 것 같은 착각을 심어주기 딱 좋은 언어죠.
Commented by Nara at 2008/09/08 03:01
개인적으로 C++은 이름을 잘못 지었다고 봐요. 최소한 다른 알파벳으로 넘어갔어야 했습니다.
C하고는 전혀 다른 언어인데 'C'라는 공통 단어와 문법의 유사성 때문에 큰 혼란을 야기하는 듯 합니다.
Commented by JM at 2008/09/07 14:28
구조체/클래스 관련해서 리플 다신 분을 보면 C# 말씀하시는 것 같은데요. :) 이런 질문 어떠냐고 하신 분은 C++ 인지, C# 인지 명시하지 않으셨고.

C# 에서 struct 와 class 의 차이에 대해서는 http://monac.egloos.com/1991882 를 보시면 깔끔~ :)
Commented by object at 2008/09/07 14:33
트랙백한 글이 C++ 경력자를 뽑는 이야기를 다루고 있었죠. 그래서 문맥상 C++로 생각했습니다. 그리고 C#의 class/struct 내용이 C++에는 적용이 되지 않는다는 사실도 헷갈릴 소지가 많겠죠.
Commented by ㄹㄹㄹ at 2008/09/07 18:35
전산과 학생이 아니라 그런지, Master's theorem은 Introduction to algorithm에서 독학한 기억은 있어도 데이터구조 과목에서 따로 배운 적이 없네요. 전산과 커리큘럼에서는 기본으로 가르쳐 주는 건가요?
Commented by object at 2008/09/07 20:52
학교/교수마다 다르겠지만 보통 자료구조 시간에는 다루지는 않고, 알고리즘 시간에는 대부분 CLRS 책으로하니 필수적으로 합니다.
Commented by 학주니 at 2008/09/07 20:37
C에서 C++ class 구조 흉내낸다고 꽤나 땀흘린적이 있기는 한데.
멤버변수를 C 구조체에서는 함수포인터로 처리해버렸죠(아마 대부분 다 이렇게 구현하지 않을지).
Commented by object at 2008/09/07 20:53
네, 원래 C struct로 OOP를 하려면 함수포인터들을 들고 있는 방법으로 구현합니다. COM을 MIDL로 컴파일하면 생기는 파일에도 C 용은 전부다 그렇게 되어있고, 리눅스에서도 디바이스 드라이버 만들 때, 구조체들도 다 그런 식입니다.
Commented by 신바람 at 2008/09/07 23:26
사실 big O를 쓰면서 Theta로 읽어야하는(....)경우가 허다합니다. 알고리즘쪽이 더 심합니다. :)
Master theorem의 경우 CLRS에도 있긴 하지만, 강의해본 경험상 쉽지 않더군요. 프로그래밍에 대해서는, 가르치는 입장에서 보면 학생들의 기강문제가 매우 심각합니다. 아마도 다음 세 세대가 공존하는 거 같아요.
1. 프로그래밍은 나의 인생의 낙
2. 프로그래밍은 나의 생계수단
3. 프로그래밍은 절대 하기 싫어

이전에도 셋은 공존했겠지만, 최근의 경우 3이 매우 강합니다.
Commented by object at 2008/09/07 23:57
그렇죠. 빅오하고 세타하고 혼용되는 경우가 대부분입니다. CLRS에서는 비교적 잘 구분하고 있죠.
Commented by 자연풍선생 at 2008/09/07 23:30
으악 제 답변들이 보이는군요(...) 부끄럽네요;;;...ㄱ-
Commented by object at 2008/09/07 23:58
지금부터라도 제대로 알면 괜찮습니다 :)
Commented by Lyn at 2008/09/08 00:19
음.. . 뭐 다 아는거라 패스 =_=;
Commented by 지나가다 at 2008/09/08 10:40
소팅에서 stable 이란것은, comparison 이 equal 인 element 들이 소팅됬을경우 순서가 않바뀌는걸 보장하는게..........맞조? (아직 어려가지고 했갈리네요 orz)
Commented by object at 2008/09/08 12:06
맞습니다. 같은 원소들이 소팅'됐'을 경우 순서가 '안' 바뀌는 것을 보장하죠. 버킷 소트 같은 경우는 이 성질이 중요하게 쓰이기도..
http://en.wikipedia.org/wiki/Category:Stable_sorts
Commented by 모아 at 2008/09/08 15:16
구글에서는 struct는 모두 public member variable과 Init 함수만을 사용하도록 style guide를 해놨죠.
무엇보다 C++에서 struct 에도 Constructor & Destructor가 된다는 사실!
Commented by 물탄찬밥 at 2008/09/10 17:11
1. 차이는 아니지만... struct를 sizeof용으로 쓰다가 가상함수 실수로 넣게되면 사용자제작(?) 버그를 만들수도... 차이는 크게 없지만 데이터저장용도와 오브젝트설계용으로 나눠서 잘 쓰는것이...정석...
Commented by ghost at 2008/10/16 03:07
이거 I 사 전화인터뷰 질문이었습니다.

:         :

:

비공개 덧글

<< 이전 페이지 다음 페이지 >>





by 김민장 2008 이글루스 TOP 100
최근 등록된 덧글
개발자 입장에서의 수많은 ..
by Jiyoon at 02/04
저도 아들 돌잔치때 돌잡이 ..
by 박상욱 at 01/18
미국 대학원 원서 작성중에 p..
by 태클사이야 at 01/13
TO: 박PD 로그인 하지 않아..
by 박응용 at 01/10
http://gigglehd.com/zbx..
by dhunter at 12/28
우와.. 좋네요. 태반이 ..
by 윤광배 at 12/17
항상 좋은 글 잘 보고 있습니..
by y2k at 11/23
글이 좋아서 제 블로그에 담..
by 쏭섭 at 11/23
최근 등록된 트랙백
조엘 스폴스키의 강연 (Sta..
by 인덕원칸타타
[Redis] sds.c를 분..
by 조급하지말고 천천히
메뉴릿
이글루 파인더

website counter

Add to Google

rss

skin by 이글루스