Union ์ C ์ธ์ด์์ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์ ์ ํ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ์ ์ฅํ ์ ์๊ฒ ํ๋ ํค์๋์ด๋ค. ์ด๋ ๊ตฌ์กฐ์ฒด(struct)์ ๋น์ทํ์ง๋ง, Union ๋ด์ ๋ชจ๋ ๋ฉค๋ฒ๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ณต์ ํ๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก, ํ ์์ ์ ํ๋์ ๋ฉค๋ฒ๋ง ์ ์ฅํ๊ณ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๊ฐ์ฅ ํฐ ํฌ๊ธฐ์ ๋ฉค๋ฒ์ ์ํด union์ ์ ์ฒด ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ง๋ง, ๋ฉค๋ฒ ๊ฐ์ ๊ฐ์ ์ค๋ฒ๋ผ์ดํธ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ์ ์ ์ ์ํด์ผ ํ๋ค.
โญ1. Union ์ฌ์ฉ๋ฒ
#include <stdio.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
data.i = 10;
printf("data.i : %d\n", data.i);
data.f = 220.5;
printf("data.f : %f\n", data.f);
sprintf(data.str, "%s", "C Programming");
printf("data.str : %s\n", data.str);
return 0;
}
์ด ์์ ์์ union Data๋ ์ ์(int), ๋ถ๋ ์์์ (float), ๋ฌธ์์ด(char[]) ์ค ํ๋๋ฅผ ์ ์ฅํ ์ ์๋ค. union์ ์ฌ์ฉํ๋ฉด ์ธ ๊ฐ์ง ํ์
์ค ํ๋๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ณ , ๊ฐ์ฅ ์ต๊ทผ์ ์ ์ฅ๋ ๊ฐ๋ง ์ ํจํ๊ฒ ๋๋ค. ์ด๋ ๋ชจ๋ ๋ฉค๋ฒ๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด, ๋ง์ง๋ง์ ์ ์ฅ๋ ๊ฐ์ธ ๋ฌธ์์ด "C Programming"๋ง ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๋ ฅ๋๋ฉฐ, ๋ค๋ฅธ ํ๋๋ ์ค๋ฒ๋ผ์ดํธ๋๋ค.
์ฆ, ๋ชจ๋ ๋ฉค๋ฒ๊ฐ ๋์ผํ ์ฃผ์๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋์
ํ ๋ ๋ง๋ค ๋ชจ๋ ๊ฐ๋ค์ด ๊ฐฑ์ ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด Union์ ์ด๋ค ์ํฉ์์ ์ธ ์ ์๋๊ฐ?
โญ2. UNION ๊ณต์ฉ์ฒด์ STRUCT ๊ตฌ์กฐ์ฒด๋ก ํจํท ๋ง๋ค๊ธฐ
๋ํ์ ์ผ๋ก ํต์ ๋ถ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ค. ํต์ ์์๋ ๋ฐ์ดํฐ๋ฅผ ์ก์ ํ๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ๋ฐ์ดํฐ๋ฅผ ์์ ํด์ ์ ๋๋ก ํด์ํ๋ ๊ฒ๋ ๊ต์ฅํ ์ค์ํ๋ค. ๊ตฌ์กฐ์ฒด์ ๊ณต์ฉ์ฒด๋ฅผ ์ ์ ํ ์ฌ์ฉํ๋ฉด ํ๊ธฐ์ ๋ฐ์ดํฐ ์ก์์ ์์ ๋ฅผ ๋ง๋ค ์ ์๋ค.
#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;
}
์ด ์ฝ๋๋ C ์ธ์ด๋ก ์์ฑ๋ ์ํํธ์จ์ด์์ ๋ฐ์ดํฐ ํจํท์ ํํํ๊ณ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋ค. struct packet_s๋ 4๊ฐ์ uint8_t ๋ฐ์ดํฐ ํ๋๋ฅผ ๊ฐ์ง๊ณ ์์ด, ๊ฐ๊ฐ์ ํ๋๊ฐ ํจํท์ ํ ๋ถ๋ถ์ ๋ํ๋ธ๋ค. ์ด ๊ตฌ์กฐ์ฒด๋ union packet_u ๋ด์์ ps๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์๋์ด ์๋ค. ๋์ผํ union ๋ด์ uint8_t ํ์ ์ ๋ฐฐ์ด pu[4]๋ ์ ์๋์ด ์์ด, ์ก์ ์ ps๋ฅผ ํตํด ๊ฐ ํ๋๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ค์ ํ ์ ์๊ณ , ์์ ์ pu ๋ฐฐ์ด์ ํตํด ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ฐ์๋ ๋ฐ์ดํธ๋ก ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ๊ทน๋ํํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ ์ฐํ๊ฒ ์ ๊ทผํ ์ ์๊ฒ ํด์ค๋ค.
'๐ท C์ธ์ด 30๊ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C/C++ Tip] 8. ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ (0) | 2024.09.07 |
---|---|
[C/C++ Tip] 7. ๋ฐฐ์ด์ ๊ธฐ์ด (1) | 2024.09.04 |
[C/C++ Tip] 5. ๊ตฌ์กฐ์ฒด ํจ๋ฉ์ ํ์์ฑ (0) | 2024.09.04 |
[C/C++ Tip] 4. ๊ตฌ์กฐ์ฒด ํ์ฉ: ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ (2) | 2024.09.02 |
[C/C++ Tip] 3. ์ฝ๋ฉ ๊ท์น. ๋ณ์๋ช ์ ํ๊ธฐ (0) | 2024.09.01 |