STUCT(구조체)와 UNION(공용체)은 데이터를 묶음으로 사용하는 자료구조다
정의 방법도 비슷하고 사용 이유도 같지만,
둘의 차이점은 메모리 적재 방식이다
메모리에 어떻게 쌓이길래 다른지와 사용 방법에 대해 간단히 정리하겠다
** 메모리 묶음 타입 **
C - STRUCT와 UNION 제공
C++ - Class, STRUCT, UNION 제공
1. STRUCT와 UNION 사용 방법
(1) STRUCT (구조체) 사용
struct라는 단어에 생소해할 필요는 없다
int, char형 등의 데이터 형과 결국에는 같다 ㅇㅇ
STRUCT의 특징
- 데이터를 다채롭게 표현할 수 있다
- 데이터형의 역할이다
- 구조체 이름 지을 때는 C 명명 규칙 사용하면 좋다
- 구조체 확장 개념 → Class (C++에서)
struct는 아래와 같이 사용 가능하다
struct myStruct { int num; char *str; double dnum; };
데이터 타입과 변수를 정의한 목록을
struct라는 키워드를 사용하여 변수들을 묶어줄 수 있다
struct myStruct2 { int num1; }; struct myStruct { int num; char *str; double dnum; myStruct2 my_struct; };
또한 구조체 안에 다른 구조체를 선언하는 것도 가능하다
구조체 멤버에 접근할 때는 .이나 ->같은 접근법을 사용하면 된다
int main(void) { myStruct struct1; struct1.num = 10; cout << struct1.num << endl; struct1.my_struct.num1 = 15; cout << struct1.my_struct.num1 << endl; myStruct *struct2 = new myStruct; struct2->num = 20; cout << struct2->num << endl; return 0; }
myStruct 구조체에 대해 선언과 메모리 할당 두 경우에 대해
구조체 변수에 접근해본 예시이다
구조체 내에 있는 구조체에도 접근할 수 있는 것도 확인해보았다
결과는 아래와 같다

(2) UNION (공용체) 사용
UNION 이름은 뭔가 좀 멀게 느껴지는데 struct와 유사하다
UNION 특징
- 동일 메모리 영역을 여러 멤버 변수가 공유한다
- 모든 멤버 변수가 같은 공간을 공유
↑ 메모리 내용에 대해서는 아래에서 다시 다룰거다
UNION 사용 방법은 아래와 같다
union myUnion { int num; char *str; double dnum; };
struct랑 같은 역할이고, 방법이 비슷한데
키워드만 union으로 바뀐거여서 사용시에는 큰 다른 점이 없다
union은 byte 또는 bit 단위 계산을 할 때 많이 사용한다
일반 데이터형 변수 사용 방법은 struct와 같기 때문에
unsigned 정수형 타입을 사용한 예시를 다루겠다
union myUnion { uint8_t num1; uint16_t num2; uint32_t num3; uint64_t num4; }; int main(void) { myUnion union1; union1.num1 = UINT8_MAX; union1.num2 = UINT16_MAX; union1.num3 = UINT32_MAX; union1.num4 = UINT64_MAX; cout << unsigned(union1.num1) << endl; cout << union1.num2 << endl; cout << union1.num3 << endl; cout << union1.num4 << endl; return 0; }
참고)
** uint8_t를 출력시 unsigned() 사용 이유 **
출력 연산자가 uint8_t은 unsigned char 와 같이 처리하기 때문에
ASCII 코드(가장 일반적인 문자 인코딩 시스템)로 문자를 인쇄
uint8_t는 unsigned char의 별칭일 뿐임

2. STRUCT와 UNION 메모리 적재 방식
이 글의 첫 머리글에서 STRUCT와 UNION의 차이점은
메모리 적재 방식이라고 하였는데,
사실 이 부분에 대해 정리하기 위해 이 글을 쓴 것이다
바로 위에서 union에서 unsigned형 멤버 변수를 선언한 예제를 봤는데
요 unsigned 형 멤버 변수를 struct에서도 써보겠다
struct myStruct { uint8_t num1; uint16_t num2; uint32_t num3; uint64_t num4; }; union myUnion { uint8_t num1; uint16_t num2; uint32_t num3; uint64_t num4; }; int main(void) { myStruct struct1; myUnion union1; union1.num1 = UINT8_MAX; union1.num2 = UINT16_MAX; union1.num3 = UINT32_MAX; union1.num4 = UINT64_MAX; cout << sizeof(struct1) << endl; cout << sizeof(union1) << endl; return 0; }
결과가 어떻게 나올까?

struct와 union의 크기는 다르게 출력된다
왜 그런지를 알아보도록 하자
** 메모리의 구조 **

컴파일된 프로그램을 실행하기 위해선
위와 같은 영역으로 나뉘어 메모리에 로드가 되어야 한다
변수이냐 글로벌 변수냐, 스레드냐 등에 따라서 운영체제는
코드영역/데이터 영역/스택영역/힙 영역으로
메모리를 할당을 해준다

위의 그림을 보면 (조금 복잡하게 생겼지만 ㅜ)
우리가 사용하는 변수나 전역 변수 그리고 struct 형의 구조체도
각 메모리 영역에 할당이 되는데,
이를 메모리 적재 방식이라고 한다
즉, struct와 union의 메모리 적재 방식이 다르다는건
메모리 영역에 할당될 때의 방법이 다르단 거다
그러면 어떻게 다르냐?

STRUCT는 char, short, int 와 같이 각각의 변수들이 공간을 각각 차지한다
char 형(1byte) + short형 (2byte) + int형 (4byte) => 8 byte를 차지하는 것이다
합은 7인데, padding 값이 포함돼서 8byte인데
이는 padding에 대해서 찾아보길 바란다
UNION은 모든 멤버 변수가 같은 공간을 공유한다
그리고, 그 중 가장 큰 자료형 공간을 공유한다
위 그림에서 int형 (4byte)가 가장 크기 때문에 4byte의 공간을 공유한다
이러한 이유로
위에 예시로 든 unsigned 형 예시에서도 struct와 union 자료구조의
크기가 다르게 나온 것이다

UNION은 미리 알 수 없는 데이터 타입에 대한걸 저장할 때 사용한다
같은 크기로 구성된 배열 요소에 다양한 크기를 저장할 수 있다 이 말
struct와 union이 사용은 헷갈리지만
그 용도와 차이점을 생각해서 쓰면
메모리 절약에도 도움이 될 것이다 +_+
[ 참고 자료 ]
https://stackoverflow.com/questions/19562103/uint8-t-cant-be-printed-with-cout
uint8_t can't be printed with cout
I have a weird problem about working with integers in C++. I wrote a simple program that sets a value to a variable and then prints it, but it is not working as expected. My program has only two ...
stackoverflow.com
http://tcpschool.com/c/c_struct_unionEnum
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'BackEnd > C랑 C++' 카테고리의 다른 글
전처리기(preprocessor)와 매크로(macro) (0) | 2022.02.07 |
---|---|
Error 해결: boost::shared_ptr<boost::asio::io_context>::operator* (0) | 2022.02.04 |
C++ 스마트 포인터를 알아보자 - (2) shared_ptr (0) | 2021.06.25 |
Error 해결: undefined reference to `vtable for XXX' (0) | 2021.06.24 |
Boost-echo tcp client & server를 살펴보자 (1) (2) | 2021.06.11 |