-
C++에서 언제 어떻게 struct를 사용하는가?Programmer/Programming 2017. 9. 25. 16:03
C++로 코딩할 때에 class와 struct 중에 무엇을 사용할 지 고민을 할 때가 있다.
내가 C++에서 struct를 선택하는 기준은 다음과 같다.- 분해하면 모든 멤버 변수가 scala data type이다.
멤버 변수 중에 union, struct 또는 고정 길이 array를 만나면 재귀적으로 분해한다.
모든 말단이 scala data type으로 이루어졌다면 struct를 사용한다.
즉, 분해하는 과정에서 포인터나 가변 길이 배열, 클래스를 만나면 struct를 사용하지 않는다. - 구조체를 이진 데이타로 고스란히 pack/unpack 해야 한다.
struct는 메모리 형태 그대로 데이터로 상호 변환 가능함으로 개발하기 편하다.
굳이 별도의 pack/unpack 함수를 작성할 필요가 없다.
단, 데이터 구조체 정렬(data structure alignment)를 주의한다. 1 - 모든 멤버 변수를 외부에 공개할 수 있다.
반대로 외부에 공개할 필요가 없는-예를 들여, 구현의 변경에 따라서 얼마든지 바뀔 수 있는 구현 의존적인- 멤버 변수가 있다면 class로의 구현을 고민한다. 2
비록 C++의 struct가 기본 접근 속성이 다른 class의 변종 정도지만,
되도록 C의 그것과 동일한 의미로 사용되도록 작성하는 편이다.
그렇게 하기 위해서는 아래 제약 사항을 지켜야 한다.- 상속(inheritance)을 받지 않았다.
상속은 메모리 구성을 보장하지 않는다.
상속이 필요하면 구성(composition)으로 해결한다.
상속받을 struct를 대개 첫번째 멤버 변수로 등록한다. - 멤버 함수를 만들지 않는다.
생성, 초기화, 복사, 할당은 대개 변수의 선언이나 메모리 초기화/복사 등으로 구현한다.
다른 연관 함수들은 전역 함수 내지는 별도의 구현 class를 이용하여 작성한다.
- 이에 관해서는 "C언어에서 struct 정의 그대로 이진 데이터로 만들기"를 참고한다. [본문으로]
- 외부 공개용 struct와 내부 구현용 struct/class로 분리하는 전략도 있음으로 반드시 class를 선택할 필요는 없다. [본문으로]
'Programmer > Programming' 카테고리의 다른 글
파이썬 프러퍼티 사용하여 일관되게 속성에 접근하라 (0) 2018.01.17 기본 값(default value)을 언제 사용할까? (0) 2018.01.02 일단 만들어라. 두 번 만들어라. 그러면 보일 것이다. (0) 2017.06.29 문제가 발생하면 근본 원인 찾아라. (1) 2017.03.06 엑세스 함수(getter/setter)를 올바로 사용하기 (1) 2017.02.13 댓글
- 분해하면 모든 멤버 변수가 scala data type이다.