C++ struct와 class의 차이? by object

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

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이 어떤 의미인지도 모르는 친구들도 태반일 것 같고... 아 잘난체 했는데 혹시 틀린게 있을까봐 겁납니다.


덧글

  • 게드 2008/09/07 13:09 # 답글

    예전 사이냅에서 전화면접으로 나왔던 문제라 붇여뒀었습니다.. C와 C++의 구조체가 다르다면 질문 자체가 틀린거군요
  • object 2008/09/07 14:49 #

    예전에 재밌는 문제로 사람들 좀 골탕먹였던 사이냅... 이군요. ㅎㅎ
  • signer 2008/09/07 13:13 # 삭제 답글

    음... 이젠 어디가서 댓글로 뭐달린거 읽기가 두렵습니다.
    뭘믿고 공부하고 해야할지... 제대로된 책뿐인가요? ㅎㅎ
  • object 2008/09/07 14:50 #

    저는 일단 인터넷 정보는 안 믿고 봅니다. 광우병도.. ㅋㅋ
  • signer 2008/09/09 22:44 # 삭제

    -_-;;;
  • 엘센 2008/09/07 13:14 # 답글

    빅오, 빅오메가, 쎄타 표기법은 알았는데 스몰오는 처음 알았네요.
    점근적상한에 대해선 보통 자료구조, 알고리즘때 중요하게 다루기 때문에 대부분 알지 않을까요?

    C와 C++의 구조체가 다르다는 것은 처음 알았네요... 역시 프로그래밍을 안하다보니 간단한것도 놓치게 되는군요.
  • object 2008/09/07 14:10 #

    리틀오는 오히려 미적분학 책에서 자주 봤죠.... ㅋㅋ
  • 가이우스 2008/09/07 13:32 # 답글

    신경쓰지 않으면 은근히 쉽게 잊어먹는게 저런거라고 생각합니다..
    (저런 비스므리한 질문을 받았다가 잘못 대답해서 교수님한테 혼났습니다.. ㅠ.ㅠ)
  • 가이우스 2008/09/07 13:59 # 답글

    여담으로 제일 답답했던 경우가
    저런 개념을 쏼라쏼라 책에 있는 그대로 읊을 줄 아는 녀석이

    막상 코딩 시작하니 손도 못데고 있더군요... 꽤 여러과목을 같이 듣고
    같은 팀이 되었는데(같은 학년이기도 해서) 나중에는 자바스크립트도 손못데고
    코딩은 책에 있는 것보고서나 할 줄 알지 조금만 바뀌면 버벅이고...
    이런 녀석도 은근히 짜증나더군요.
  • object 2008/09/07 14:10 #

    컴공과 교수들 중에 컴퓨터 부품 제대로 주문해서 제대로 조립할 수 있는 사람 거의 없을 걸요.. ㅋ
  • 시즈하 2008/09/07 14:05 # 답글

    구조체와 클래스의 차이점은 C에서 C++로 넘어갈 때 C++에 새로 도입된 class의 개념을 설명하기 위해 나온 얘기라고 생각합니다. 하지만 정작 C++에서는 struct에 대한 정의 자체가 달라져 있는데, 책에서는 C의 struct와 C++의 struct의 차이에 대해서는 빠트렸거나 아님 대충 넘어갔거나 혹은 그 부분은 못 읽고 지나쳤거나 해서 그런 오해를 갖고 있는지도 모르겠습니다. 가르쳐 주는 쪽에서도 그냥 class를 쓰라고 하지 'C++의 struct는 이런 것도 되요...' 라고 알려주는 경우는 별로 없을 것 갈네요.
  • object 2008/09/07 14:06 #

    일단 C++ 21일 완성에는 나오지가 않습니다 :)
  • 게드 2008/09/07 14:08 #

    21일 완성이 문제군요 <-
  • object 2008/09/07 14:50 #

    21일 완성 저는 좋아해요. 빠르게 맛을 보는덴 최고죠. 물론 거기서 끝내면 낭패.
  • object 2008/09/07 14:54 #

    저는 이걸 몰랐다고 "아 저 친구 C++ 공부 별로 안 했네" 이렇게는 절대 생각하지 않습니다. 아마 면접관들도저와 비슷한 생각을 하고 있을거에요. 이건 뭐랄까 C++에 대한 애정의 정도? 로 생각하면 좋을 것 같습니다. 그리고 언어 자체가 다소 struct/class를 모호하게 디자인한 것도 잘못이라고 봐야겠죠. 이래저래 C++은 learning curve가 무척이나 크고, 더욱더 큰 문제는 조금만 배워도 다 알 것 같은 착각을 심어주기 딱 좋은 언어죠.
  • Nara 2008/09/08 03:01 #

    개인적으로 C++은 이름을 잘못 지었다고 봐요. 최소한 다른 알파벳으로 넘어갔어야 했습니다.
    C하고는 전혀 다른 언어인데 'C'라는 공통 단어와 문법의 유사성 때문에 큰 혼란을 야기하는 듯 합니다.
  • JM 2008/09/07 14:28 # 삭제 답글

    구조체/클래스 관련해서 리플 다신 분을 보면 C# 말씀하시는 것 같은데요. :) 이런 질문 어떠냐고 하신 분은 C++ 인지, C# 인지 명시하지 않으셨고.

    C# 에서 struct 와 class 의 차이에 대해서는 http://monac.egloos.com/1991882 를 보시면 깔끔~ :)
  • object 2008/09/07 14:33 #

    트랙백한 글이 C++ 경력자를 뽑는 이야기를 다루고 있었죠. 그래서 문맥상 C++로 생각했습니다. 그리고 C#의 class/struct 내용이 C++에는 적용이 되지 않는다는 사실도 헷갈릴 소지가 많겠죠.
  • ㄹㄹㄹ 2008/09/07 18:35 # 삭제 답글

    전산과 학생이 아니라 그런지, Master's theorem은 Introduction to algorithm에서 독학한 기억은 있어도 데이터구조 과목에서 따로 배운 적이 없네요. 전산과 커리큘럼에서는 기본으로 가르쳐 주는 건가요?
  • object 2008/09/07 20:52 #

    학교/교수마다 다르겠지만 보통 자료구조 시간에는 다루지는 않고, 알고리즘 시간에는 대부분 CLRS 책으로하니 필수적으로 합니다.
  • 학주니 2008/09/07 20:37 # 삭제 답글

    C에서 C++ class 구조 흉내낸다고 꽤나 땀흘린적이 있기는 한데.
    멤버변수를 C 구조체에서는 함수포인터로 처리해버렸죠(아마 대부분 다 이렇게 구현하지 않을지).
  • object 2008/09/07 20:53 #

    네, 원래 C struct로 OOP를 하려면 함수포인터들을 들고 있는 방법으로 구현합니다. COM을 MIDL로 컴파일하면 생기는 파일에도 C 용은 전부다 그렇게 되어있고, 리눅스에서도 디바이스 드라이버 만들 때, 구조체들도 다 그런 식입니다.
  • 신바람 2008/09/07 23:26 # 답글

    사실 big O를 쓰면서 Theta로 읽어야하는(....)경우가 허다합니다. 알고리즘쪽이 더 심합니다. :)
    Master theorem의 경우 CLRS에도 있긴 하지만, 강의해본 경험상 쉽지 않더군요. 프로그래밍에 대해서는, 가르치는 입장에서 보면 학생들의 기강문제가 매우 심각합니다. 아마도 다음 세 세대가 공존하는 거 같아요.
    1. 프로그래밍은 나의 인생의 낙
    2. 프로그래밍은 나의 생계수단
    3. 프로그래밍은 절대 하기 싫어

    이전에도 셋은 공존했겠지만, 최근의 경우 3이 매우 강합니다.
  • object 2008/09/07 23:57 #

    그렇죠. 빅오하고 세타하고 혼용되는 경우가 대부분입니다. CLRS에서는 비교적 잘 구분하고 있죠.
  • 자연풍선생 2008/09/07 23:30 # 답글

    으악 제 답변들이 보이는군요(...) 부끄럽네요;;;...ㄱ-
  • object 2008/09/07 23:58 #

    지금부터라도 제대로 알면 괜찮습니다 :)
  • Lyn 2008/09/08 00:19 # 삭제 답글

    음.. . 뭐 다 아는거라 패스 =_=;
  • 지나가다 2008/09/08 10:40 # 삭제 답글

    소팅에서 stable 이란것은, comparison 이 equal 인 element 들이 소팅됬을경우 순서가 않바뀌는걸 보장하는게..........맞조? (아직 어려가지고 했갈리네요 orz)
  • object 2008/09/08 12:06 #

    맞습니다. 같은 원소들이 소팅'됐'을 경우 순서가 '안' 바뀌는 것을 보장하죠. 버킷 소트 같은 경우는 이 성질이 중요하게 쓰이기도..
    http://en.wikipedia.org/wiki/Category:Stable_sorts
  • 모아 2008/09/08 15:16 # 삭제 답글

    구글에서는 struct는 모두 public member variable과 Init 함수만을 사용하도록 style guide를 해놨죠.
    무엇보다 C++에서 struct 에도 Constructor & Destructor가 된다는 사실!
  • 물탄찬밥 2008/09/10 17:11 # 삭제 답글

    1. 차이는 아니지만... struct를 sizeof용으로 쓰다가 가상함수 실수로 넣게되면 사용자제작(?) 버그를 만들수도... 차이는 크게 없지만 데이터저장용도와 오브젝트설계용으로 나눠서 잘 쓰는것이...정석...
  • ghost 2008/10/16 03:07 # 삭제 답글

    이거 I 사 전화인터뷰 질문이었습니다.
  • 이성열 2012/06/15 14:27 # 삭제 답글

    모두들 참 대단하시네요.
    대학 교육이 문제라는 점은 뼈저리게 공감합니다.
    저를 포함해서 여기 글쓰신 대부분이 맞춤법은 다 틀리고 계시니 말입니다.

    빅오라느니 스몰오라느니 그런거 모르니까 대학교육이 문제고 프로그래머로써 자질이 의심되는 거였네요.

    근데 글쓰기 문법이 틀려도 사회생활하는데 말하기 자질 의심받은 적은 없으신가요?

    하긴 틀린 것도 모르는데 사회생활에서 언제 글쓰기 문법이 필요한 지 알아서 뭐할겠습니까...

    제 글에도 문법 틀린 거 투성이라고 댓글이 붙겠죠? 괜찮아요 그래도 먹고 사는데 지장없으니까
  • ㅇㅇ 2017/07/04 08:56 # 삭제 답글

    그럼 c++에서 구조체와 클래사 파이사 무엇인가요?
댓글 입력 영역