struct와 class의 차이는 무엇인가

Tags:

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에서 명시적으로 설명하고 있습니다.

Comments

7 responses to “struct와 class의 차이는 무엇인가”

  1. charlz Avatar

    C++에는 애매하지만, C#에서는 확실한 차이가 있지요.^^

  2. MKSeo Avatar
    MKSeo

    와주셔서 감사해요.. 그래도 담에는 뭐가 다른지 쓰고 가주시는 센스를;; 뭔가 문법이 잘 정리된 페이지를 msdn2에서 찾다가 결국 ‘자바개발자를 위한 C#문법’에서 찾아낸;;

    http://msdn.microsoft.com/vstudio/java/gettingstarted/csharpforjava/

    structs differ from classes in that they cannot be abstract and do not support implementation inheritance. The important difference with a class is that structs are value types, while classes are reference types. There are some differences in the way constructors work for structs. In particular, the compiler always supplies a default no-parameter constructor, which you are not permitted to replace.

    한마디로 ‘데이터 넣고 다닐때 써라’ 라는 것 같군요. 그래도 default constructor 못바꾸게 한건 무슨 이유인지;

  3. CN Avatar

    C#의 struct는 value 타입을 위한 것이고 class는 reference를 위한 것이기 때문에 사실상 struct는 거의 사용하지 않습니다. value 타입에서 다형성을 얻기 위해서는 사실상 C++ template keyword의 정적 다형성의 필요성이 높고 C#/JAVA와 같은 언어는 동적 다형성 세계의 언어이기 때문에 효용이 떨어진다고 판단합니다. 그렇다고 C#/JAVA에 정적 다형성을 도입하는 것은 대부분의 프로그래머가 정적 다형성에 익숙하지 못하기 때문에 언어 아키텍쳐들이 결정하기 애로사항이 꽃필 것 같습니다.

    C++ 진영에서는 generic keyword를 포함시켜서 동적 다형성의 세상을 보다 확장하고자 하는 노력이 있습니다. 대체로 Herb Sutter를 비롯한 친 MS 세력이 주도하고 있는데 어떻게 될지 지켜봐야 할 일이겠지요. C++ 진영 내에서도 더 강력해지는 것 보다는 더 교육을 잘하는 것이 먼저이지 않느냐는 자성의 소리도 있으니깐요 (..)

  4. MKSeo Avatar
    MKSeo

    제 생각에 struct는 value 이고, 또 functor인 역할을 합니다. 그리고 포스트에도 적었듯이 문법적으로는 class와 큰 차이는 없습니다.

    CN님이 말씀하신, value에 대한 정적 다형성이 얼마나 유용한지에 대해서는 저는 의문스럽습니다. 물론 라이브러리로 작성되면 그것을 가져다 쓰는 것이 편리하다는 것은 당연하지만, 간단한 라이브러리를 만드는 사람 입장에서도 생각해야하는 것이 너무나 많아 보입니다. 이것이 단지 현재 C++의 한계 때문이어서 C++0x (2009년에 나온다길래 대략 ‘그러든지 말든지’로 자포자기중이기는 합니다만) 가 나오면 해결이 되는 것인지, 아니면 정적 다형성 자체가 프로그래밍하기도, 디버깅하기도, 사용하기도 어렵기 때문인지는 모르겠습니다.

    언어가 많은 부분을 사전에 구현해 놓은 라이브러리를 제공한다면 – 지금의 boost처럼요 – 유용해 보입니다.다만 그 해결책이 Bjarne Stroustrup의 말마따나 “useful 하기는 한데 elegant 한지는 상관하지 않는” 지금 같은 식이면 너무 곤란해 보입니다. C++이야 기왕지사 이렇게 된거니 외길을 타도 되겠죠..

    C#이나 Java에 같은 것이 들어온다면 적극 반대하고 싶습니다. 지금의 generics만으로도 충분히 복잡해 보이거든요.

  5. CN Avatar

    C#의 struct도 functor의 역활을 할 수 있나요?

    저는 domain language를 만들기 어려운 언어는 반드시 복잡해지기 마련이다고 생각하고 있기 때문에 C#과 Java는 훨씬 더 복잡해질꺼라고 생각합니다. (..)

  6. MKSeo Avatar
    MKSeo

    아.. 음.. 이런 제가 글을 잘못쓴듯

    1) 제 생각에 struct는 value 이고, 또 functor인 역할을 합니다. 그리고 포스트에도 적었듯이 문법적으로는 class와 큰 차이는 없습니다. -> 이건 C++에 대한내용이었는데 그 위치에 제가 그렇게 답글을 달아서 문제가 있네요;;

    2) C#과 자바는 더 복잡해지겠죠. (안그러면 심심하잖아요;) 그런데, API측면에서 그럴거라 생각합니다. API는 이미 왠간해선 다 알기 어렵게 복잡해지고 있죠. 하지만 문법이나 언어 그 자체에 대해서만 생각하면 C++에 비해선 새발의 피입니다.

    이번에 템플릿이 자바에 들어왔지만, 템플릿 넣자는 얘기는 대략 6~8년된 얘기였습니다. 자바엔 복잡한 요소가 들어오기 정말 힘듭니다. 오퍼레이터 오버로딩은 여전히 없어서 new String(“hi”) == new String(“hi”) 는 아직도 false 죠. 어처구니 없지만, 변화가 느리게 느리게 혹은 전혀 안 발생하지 않을까 생각되요. 그냥 제 생각입니다. ㅎㅎ

    CN님 홈피는 가끔 가보려고 하는데 자꾸 뜨다 안뜨다하네요;; kldp 에서 글을 본것 같은데, kldp에 글 올리시는분 맞죠??

  7. CN Avatar

    예 C++에서는 차이가 없는 것 같습니다. 저도 public 속성때문에 struct를 많이 쓰는 편입니다. :-)

    저는 자바는 API 쪽은 충분히 경쟁우위에 있지 않느냐고 생각합니다. wish list에 템플릿이 JAVA를 설계하는 시점부터 상위권에 올라와 있다고 들었는데 API가 경쟁우위에 있기 때문에 상대적으로 언어 자체에 신경을 많이 쓸 시기가 되지 않았나 생각합니다. 그런데 언어에 신경을 쓰면 쓸수록 복잡해질 수 밖에 없지 않을까 예상합니다. Haskel이나 LISP처럼 언어의 스펙을 변경없이 확장하기 쉬운 언어들이 아니니깐요.

    뜨다 안뜨다하는 것은 이유는 잘 모르겠습니다. KLDP에 가끔 글 적는 허접입니다. (..)

Leave a Reply

Your email address will not be published. Required fields are marked *