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
'๐ 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 |