안녕하세요. 오늘은 UNION과 STRUCT에 대해 이야기 하겠습니다.
구조체에 대한 이야기는 위에 작성했지만, 저보다 훨씬 자세히 적은 블로그 분들이 많기 때문에 따로 찾아보시길 바랍니다.
UNION의 구조를 먼저 알아보겠습니다.
UNION은 가장 사이즈가 큰 변수와 메모리를 공유합니다.
이게 무슨 말인가 하면
#include <stdio.h>
// 공용체 선언
typedef union data
{
char a;
char b;
char c[2];
}Data;
int main(){
Data data; // 공용체 data 정의
data.c[0] = 'a';
data.c[1] = 'b';
printf("data.a = %c\n", data.a);
printf("data.b = %c\n", data.b);
printf("data.c[0] = %c\n", data.c[0]);
printf("data.c[1] = %c", data.c[1]);
return 0;
}
이런 간단한 코드에서 결과는 어떻게 나올까요?
왜 이런 결과가 나오느냐. 그림을 보시면 바로 이해할 수 있습니다.
이런 구조로 메모리를 서로 공유하고 있습니다. 주소를 찍어보면 더 확실하게 알 수 있습니다.
#include <stdio.h>
typedef union data
{
char a;
char b;
char c[2];
}Data;
int main(){
Data data;
data.c[0] = 'a';
data.c[1] = 'b';
printf("data.a = %p\n", &data.a); // a 주소 출력
printf("data.b = %p\n", &data.b); // b 주소 출력
printf("data.c[0] = %p\n", &data.c[0]); // c[0] 주소 출력
printf("data.c[1] = %p", &data.c[1]); // c[1] 주소 출력
return 0;
}
Union의 사이즈는 가장 사이즈가 큰 변수이며, 메모리를 공유합니다.
Union은 어디에 많이 쓰일까요? 대표적으로 통신 분야로 가장 많이 사용됩니다.
통신에서는 데이터를 전송을 잘하는 것도 중요하지만, 데이터를 수신해서 제대로 분해하는 것도 굉장히 중요합니다.
꼭 이렇게 사용한다는 아니지만, 구조체와 적절히 사용하면 송신부분 수신부분을 만들 수 있습니다.
#include <stdio.h>
#include <stdint.h>
// Struct Packet_s 선언
typedef struct packet_s
{
uint8_t data0;
uint8_t data1;
uint8_t data2;
uint8_t data3;
}Packet_s;
typedef union packet_u
{
Packet_s ps; // Struct Packet_s ps 정의 // 송신
uint8_t pu[4]; // 수신
}Packet_u;
int main()
{
Packet_u packet_data;
packet_data.ps.data0 = 0; // 예를 들어 uuid
packet_data.ps.data1 = 1; // minor
packet_data.ps.data2 = 2; // tx power
packet_data.ps.data3 = 3; // rssi
printf("pacekt_data size = %d bytes\n\n", sizeof(packet_data));
printf("송신 사이즈 : %d bytes\n\n", sizeof(packet_data.ps));
printf("------송신 준비 완료------\n");
printf("--------------------------\n");
printf("--------------------------\n");
printf("-------송수신 완료--------\n\n");
printf("수신 사이즈 : %d bytes\n", sizeof(packet_data.pu));
printf("uuid = %d\n", packet_data.pu[0]);
printf("minor = %d\n", packet_data.pu[1]);
printf("tx power = %d\n", packet_data.pu[2]);
printf("rssi = %d\n", packet_data.pu[3]);
return 0;
}
이런식으로 재밌게 구조체와 공용체를 관계를 적절히 사용하여 통신 패킷을 만들어 보았습니다.
그 외에도 Union은 다양한 방법으로도 유용하게 사용되고 있습니다.
728x90
반응형
'C, C++' 카테고리의 다른 글
[CPP] strcpy_s 사용 예제 (0) | 2021.08.23 |
---|---|
[C] Call by Value VS Call by Reference (0) | 2021.08.16 |
[C] 구조체 포인터 접근과 최적화 (0) | 2021.01.19 |
[C]BMP구조체 : #pragma pack(push,1 )사용하지 않고 정렬하기 2탄 (0) | 2020.03.02 |
[C]BMP구조체 : #pragma pack(push, 1) 사용하지 않고 정렬하기 (0) | 2020.02.18 |