C Programming Language/C

C์–ธ์–ด ๊ตฌ์กฐ์ฒด union, enum, typedef ๋ž€?

567Rabbit 2024. 8. 2. 15:50

 

๊ณต์šฉ์ฒด(union) : ์œ ๋‹ˆ์˜จ 

 

- ์ž„๋ฒ ๋””๋“œ์‹œ์Šคํ…œ, ์ปค๋„ ๋“ฑ ๋ฐ์ดํ„ฐ ์šฉ๋Ÿ‰ ์ œํ•œ์ด ์‹ฌํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

- ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜๊ฐ€ ๊ณต์œ 

- ๊ณต์šฉ์ฒด๋ฅผ ์„ ์–ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ตฌ์กฐ์ฒด์™€ ์•„์ฃผ ๋น„์Šท

 

c, h
๋‹ซ๊ธฐ
union example{ โ€‹โ€‹โ€‹โ€‹char c; //๊ฐ™์€ ๊ณต๊ฐ„ ๊ณต์œ  โ€‹โ€‹โ€‹โ€‹int i; //๊ฐ™์€ ๊ณต๊ฐ„ ๊ณต์œ  };
c, h
๋‹ซ๊ธฐ
#include <stdio.h> union example{ โ€‹โ€‹โ€‹โ€‹int i; โ€‹โ€‹โ€‹โ€‹char c; }; int main(void) { โ€‹โ€‹โ€‹โ€‹union example v; โ€‹โ€‹โ€‹โ€‹v.c = 'A'; โ€‹โ€‹โ€‹โ€‹printf("v.c:%c v.i:%i\n", v.c, v.i); โ€‹โ€‹โ€‹โ€‹ โ€‹โ€‹โ€‹โ€‹v.i = 10000; //v.i๋Š” v.c์™€ ๊ฐ™์€ ์˜์—ญ์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ v.c๊ฐ€ 10000์œผ๋กœ ๋ฐ”๋€๋‹ค. โ€‹โ€‹โ€‹โ€‹printf("v.c:%c v.i:%i\n", v.c, v.i); }

 

 

 

์˜ˆ์‹œ

c, h
๋‹ซ๊ธฐ
// ํ•™๋ฒˆ ๋˜๋Š” ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ ํ•˜๋‚˜๋งŒ ์ž…๋ ฅํ•˜๋ฉด ๋˜๋Š” ๊ฒฝ์šฐ #include <stdio.h> #include <string.h> #define STU_NUMBER 1 #define REG_NUMBER 2 struct student { โ€‹โ€‹โ€‹โ€‹int type; โ€‹โ€‹โ€‹โ€‹union{ โ€Œโ€‹โ€‹โ€‹โ€‹int stu_number; //ํ•™๋ฒˆ โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹char reg_number[15]; //์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ โ€‹โ€‹โ€‹โ€‹} id; //๋ณ€์ˆ˜ ์ด๋ฆ„ ์„ ์–ธ โ€‹โ€‹โ€‹โ€‹char name[20]; }; void print(struct studnet s) { โ€‹โ€‹โ€‹โ€‹switch(s.type) โ€‹โ€‹โ€‹โ€‹{ โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹case STU_NUMBER; โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹printf("ํ•™๋ฒˆ %d\n", s.id.stu_number); โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹printf("์ด๋ฆ„ %s\n", s.name); โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹break; โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹case REG_NUMBER; โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹printf("์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ %s\n", s.id.reg_number); โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹printf("์ด๋ฆ„ %s\n", s.name); โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹break; โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹default: โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹printf("ํƒ€์ž…์˜ค๋ฅ˜\n"); โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹โ€‹break; โ€‹โ€‹โ€‹โ€‹} }

 

 

 

 

 

์—ด๊ฑฐํ˜•(enumeration) : enum

 

๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’๋“ค์„ ๋ฏธ๋ฆฌ ์—ด๊ฑฐํ•ด ๋†“์€ ์ž๋ฃŒํ˜•

ex) ์š”์ผ์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜๋Š” {์ผ์š”์ผ, ์›”์š”์ผ, ํ™”์š”์ผ, ์ˆ˜์š”์ผ, ๋ชฉ์š”์ผ, ๊ธˆ์š”์ผ, ํ† ์š”์ผ} ์ค‘์˜ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค

 

c, h
๋‹ซ๊ธฐ
enum days { SUN, MON, TUE, WED, THU, FRI, SAT };

 

 

 

 

 

์—ด๊ฑฐํ˜• ๋ณ€์ˆ˜ ์„ ์–ธ

 

c, h
๋‹ซ๊ธฐ
enum days today; today = SUN; // OK!

 

 

 

 

 

์—ด๊ฑฐํ˜• ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”

 

- ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด 0๋ถ€ํ„ฐ ํ• ๋‹นํ•œ๋‹ค.

 

c, h
๋‹ซ๊ธฐ
enum days { SUN, MON, TUE, WED, THU, FRI, SAT }; enum days { SUN=1, MON, TUE, WED, THU, FRI, SAT }; enum days { SUN=7, MON=1, TUE, WED, THU, FRI, SAT=6 };

 

 

 

 

 

์—ด๊ฑฐํ˜•๊ณผ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๊ณผ์˜ ๋น„๊ต

 

- define๋ฌธ์ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๋‹ค.

 

 

 

 

 

 

typedef

 

- ์ž๋ฃŒํ˜•์˜ ์ด๋ฆ„์„ ๋‹ค์‹œ ์ •์˜ํ•จ

- ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ int, long ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋กœ ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

- ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ , ๋ณต์žกํ•œ ํƒ€์ž… ์„ ์–ธ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

- typedef๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด ํƒ€์ž…์— ๋ณ„๋ช…์„ ๋ถ™์ด๋Š” ๋ฐ ์œ ์šฉ

 

 

์˜ˆ์‹œ

c, h
๋‹ซ๊ธฐ
struct point { โ€‹โ€‹โ€‹โ€‹int x; โ€‹โ€‹โ€‹โ€‹int y; }; typedef struct point point_t; // ์ด๋ฆ„์„ ๋‹ค์‹œ ์ •์˜ํ•จ point_t a, b;

 

 

 

 

 

typedef์™€ #define ๋น„๊ต

 

1. ์ด์‹์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค

- ์ด์‹์„ฑ(Portability)์€ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋‹ค์–‘ํ•œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์ด๋‚˜ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์˜๋ฏธ

- ์ฆ‰, ํŠน์ • ํ”Œ๋žซํผ์—์„œ ๊ฐœ๋ฐœ๋œ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ตœ์†Œํ•œ์˜ ์ˆ˜์ •๋งŒ์œผ๋กœ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ๋„ ๋ฌธ์ œ์—†์ด ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€๋ฅผ ๋œปํ•จ

- Redirection(๋ฆฌ๋‹ค์ด๋ ‰์…˜)ํ•˜๋Š” ๊ฒƒ๋“ค์€ ์ด์‹์„ฑ์„ ๋†’์—ฌ์ฃผ๊ณ  ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

- Redirection(๋ฆฌ๋‹ค์ด๋ ‰์…˜)์€ ์ปดํ“จํŒ…์—์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ž…๋ ฅ ๋˜๋Š” ์ถœ๋ ฅ์„ ๊ธฐ๋ณธ ์œ„์น˜์—์„œ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ.

  ์ผ๋ฐ˜์ ์œผ๋กœ ๋ช…๋ น์–ด์˜ ์ž…์ถœ๋ ฅ์„ ํŒŒ์ผ์ด๋‚˜ ๋‹ค๋ฅธ ๋ช…๋ น์–ด๋กœ ์ „ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ

- ์ฝ”๋“œ๋ฅผ ์ปดํ“จํ„ฐ ํ•˜๋“œ์›จ์–ด์— ๋…๋ฆฝ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

- ex) intํ˜•์€ 2๋ฐ”์ดํŠธ์ด๊ธฐ๋„ ํ•˜๊ณ  4๋ฐ”์ดํŠธ, intํ˜• ๋Œ€์‹ ์— typedef๋ฅผ ์ด์šฉํ•œ INT32๋‚˜ INT16์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ํ™•์‹คํ•˜๊ฒŒ 2๋ฐ”์ดํŠธ์ธ์ง€ 4๋ฐ”์ดํŠธ์ธ์ง€๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. #define์„ ์ด์šฉํ•ด๋„ typedef์™€ ๋น„์Šทํ•œ ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ๋‹ค์Œ๊ณผ ๊ฐ™์ด int32๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

- #define UINT32 unsigned int

- typedef float VECTOR[2];       // #define์œผ๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค

 

3. ๋ฌธ์„œํ™”์˜ ์—ญํ• ๋„ ํ•œ๋‹ค

- typedef๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ฃผ์„์„ ๋ถ™์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ