Practice/C, C++, Java, C#

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

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

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


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

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


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

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

  2. Favicon of http://www.joyalba.com 알바 . M/D Reply

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

알림

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

카운터

Today : 38
Yesterday : 75
Total : 199,816