๐Ÿ“– C๋ž‘ C++

STRUCT์™€ UNION์„ ์•Œ์•„๋ณด์ž

bell22 2021. 7. 12. 18:22

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์˜ ๋ฉ”๋ชจ๋ฆฌ ์ ์žฌ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค๋Š”๊ฑด
๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ํ• ๋‹น๋  ๋•Œ์˜ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹จ ๊ฑฐ๋‹ค

๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๋ƒ?

TCPSchool ์‚ฌ๋ž‘ํ•ฉ๋‹ˆ๋‹ค


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