Practice/C & C++

C++에서 언제 어떻게 struct를 사용하는가?

C++로 코딩할 때에 class와 struct 중에 무엇을 사용할 지 고민을 할 때가 있다.
내가 C++에서 struct를 선택하는 기준은 다음과 같다.

  • 분해하면 모든 멤버 변수가 scala data type이다.
    멤버 변수가 scala data type이거나, 조건에 부합하는 compound data type이어야 한다.
    compound data type은 고정 길이 array, union, struct 이며, 위 조건을 만족한다.
    여기에 해당이 안되면, 즉, 포인터나 가변 길이 배열, class를 포함하고 있다면 class를 사용한다.
  • 구조체를 이진 데이타로 고스란히 pack/unpack 해야 한다.
    struct는 메모리 형태 그대로 데이터로 상호 변환 가능함으로 개발하기 편하다.
    굳이 별도의 pack/unpack 함수를 작성할 필요가 없다.
    이와 같은 용도의 struct를 만들 때에는, 데이터 구조체 정렬(data structure alignment)를 주의한다.[각주:1]
  • 모든 멤버 변수를 외부에 공개할 수 있다.
    반대로 외부에 공개할 필요가 없는-예를 들여, 구현의 변경에 따라서 얼마든지 바뀔 수 있는 구현 의존적인- 멤버 변수가 있다면 class로의 구현을 고민한다.[각주:2]


비록 C++의 struct가 기본 접근 속성이 다른 class의 변종 정도지만,
되도록 C의 그것과 동일한 의미로 사용되도록 작성하는 편이다.
그렇게 하기 위해서는 아래 제약 사항을 지켜야 한다.

  • 상속(inheritance)을 받지 않았다.
    상속은 메모리 구성을 보장하지 않는다.
    상속이 필요하면 구성(composition)으로 해결한다.
    상속받을 struct를 대개 첫번째 멤버 변수로 등록한다.
  • 멤버 함수를 만들지 않는다.
    생성, 초기화, 복사, 할당은 대개 변수의 선언이나 메모리 초기화/복사 등으로 구현한다.
    다른 연관 함수들은 전역 함수 내지는 별도의 구현 class를 이용하여 작성한다.


  1. 이에 관해서는 "<a href="http://unipro.tistory.com/197" target="_blank">C언어에서 struct 정의 그대로 이진 데이터로 만들기</a>"를 참고한다. [본문으로]
  2. 외부 공개용 struct와 내부 구현용 struct/class로 분리하는 전략도 있음으로 반드시 class를 선택할 필요는 없다. [본문으로]
저작자 표시 변경 금지
신고
  1. Favicon of http://moneycoach.kr/ 소액결제 현금화 M/D Reply

    관리자의 승인을 기다리고 있는 댓글입니다

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

Today : 6
Yesterday : 105
Total : 174,450