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λ₯Ό μ‚¬μš©ν•˜κ²Œ 되면 주석을 λΆ™μ΄λŠ” 것과 같은 효과