struct나 get/set만 가진 자바 클래스나 각각 POD 나 POJO라는 이름으로 불리고 있습니다. 각자는 Plain Old Data라거나 Plain Old Java Object의 약자입니다 . 그럼 얘네가 간단하고 오래된 것이라는 이름까지 붙었으니 나쁜건가.. 하면 꼭 그렇지는 않죠. Make it simple이란 말이 있으니. (사실 아닌게 아니라 POJO가지고 쉽게 좀 해보자..라는게 요즘은 java 세상에서의 핫 이슈이죠.)
어쨌든 C++에서는 struct와 class가 기능도 유사한데 둘이나 있습니다. 그 두가지가 존재하는 이유 중 가장 큰 것은 아마도 backward compatability 의 이슈겠죠. 하지만, 어쨌든 파들어가면 둘간의 차이는 없다.. 라고 생각합니다.
하지만 문법상의 한가지 차이가 있으니 struct의 기본 접근자는 public이지만, class는 private이라는 것입니다. 그리고 이로 인해 크게 이 둘의 사용이 차이가 나는 곳이 있으니 바로 상태를 필요로 하지 않는 functor의 경우입니다.
한가지 예로 functor에서도 특히 binary operator를 만든다면
struct ... : public binary_function<type1, type2, bool> { bool operator()(const type1 &t1, const type2 &t2, bool) { ... } }
이렇게 만들 것입니다. 이렇게 코딩할 수 있는 가장 큰 이유는 functor자체에서 어떠한 상태정보도 필요로 하지 않는 다는 점입니다. 따라서, operator() 만 코딩하면 되고 결국은 이게 public이어야 하니 class보단 struct가 이쁜 대안이 될 수 있게 되는 것이죠. 이와 같이 상태가 불필요한 functor를 struct로 하는 예에는 boost가 있습니다. 그리고 아마 또다른 struct의 사용예는 POD 그 자체에 충실하게 데이터만 담고, 모든 데이터를 public 으로 노출하는 클래스 정도가 아닐까 생각되네요.
그러나.. 이런 것은 어디까지나 취향의 문제이고 (물론 boost가 저러저러한 상황에서 struct를 쓴다는 건 쪼끔 압박이긴 합니다만 ㅋㅋ), 둘간의 차이는 없습니다.
* 수정내용.
(1) 이전글에서 제가 잘못적었던 POD의 정확한 의미는 다음과 같습니다.
POD stands for “plain old data.” Believe it or not, that’s a technical term in the C++ standard. The standard gives us license to make all kinds of special assumptions about POD types. For example, PODs always occupy contiguous bytes of storage; other types might not. A POD type is defined to be either a scalar, an array of PODs, or a struct or union that has no user-declared constructors, no user-declared copy assignment, no user-declared destructor, no private or protected non-static data members, no base classes, no non-static data members of non-POD, reference, or pointer to member type, or array of such types, and no virtual functions.
여기서 “us”는 Boost 만드는 사람들을 지칭합니다.
(2) struct와 class는 기본이 private인가, public인가의 차이외에는 다른게 없습니다. 이점은 Scott Myers의 Effective STL, David Abrahams, Aleksey Gurtovoy의 C++ Template Metaprogramming에서 명시적으로 설명하고 있습니다.
Leave a Reply