공용체는 구조체와 비슷한 구문 형식을 가지지만 각 멤버들은 같은 기억장소를 공유한다.
공용체 형은 메모리의 같은 위치에 저장될 여러 값의 집합을 정의한다.
[선언]
union short_or_float {
short s;
float f;
};
//union : 키워드
//short_or_float: 공용체 태그 이름이며, short_or_float 공용체 형을 선언한 것이다.
//s,f : 공용체의 멤버
- 공용체 변수는 구조체 변수와 같은 방법으로 선언이 된다.
union short_or_float a,b,c;
//a,b,c에 대한 기억 장소 할당
-공용체의 멤버 접근 방법은 구조체의 멤버 접근 방법과 동일하다.
a.s = 10
b.f = 1.0
[예제 프로그램]
#include <stdio.h>
typeof union short_or_float
{
short s;
float f;
} number;
int main(void){
number n;
n.s = 2007;
printf("s: %10d f: %16.10e\n", n.s, n.f); //현재 short형의 크기인 2바이트를 저장하고 n.f(4바이트)를 출력하면 올바른 값이 출력되지 않는다.
n.f = 2007.0;
printf("s: %10d f: %16.10e\n", n.s, n.f); //float형의 크기인 4바이트를 저장(2007.0)하면 n.s(2바이트)를 출력하면 올바른 값이 출력되지 않는다.
return 0;
}
[구조체와 공용체]
- 공용체는 구조체의 멤버로 주로 사용이 된다.
- 주조체가 공용체를 멤버로 가질 경우, 추가적인 멤버를 하나 더 정의하여 현재 공용체에 어떤 멤버의 값이 저장 되었는지를 표시한다.
#include <stdio.h>
#define WON 0
#define DOLLAR 1
union won_or_dollar {
int won;
float dollar;
};
struct product{
char *name;
_Bool w_d;
union won_or_dollar price; //공용체가 원/ 달러중 어떤 것으로 쓰이는 지의 여부
};
int main(void) {
int i;
struct product item[2];
item[0].name = "PMP"; //배열(상수 포인터)이 아니기 때문에 저장 바로 가능
item[0].price.won = 500000;
item[0].w_d = WON;
item[1].name = "CAMERA";
item[1].price.dollar = 799.95;
item[1].w_d = DOLLAR;
for(i=0; i<2; i++) {
printf("품명: %-10s", item[i].name);
if(item[i].w_d) //공용체 w_d의 원소에 따라 달러인지 원인지 구별 후 출력
printf("가격: $%11.2f\n", item[i].price.dollar);
else
printf("가격: %12d 원\n", item[i].price.won);
}
return 0;
}
[열거형]
열거형은 제한적이지만 숫자 대신 단어를 사용할 수 있게 한다.
키워드 enum은 열거형을 선언하는데 사용된다.
열거형은 유한집합을 명명하고, 그 집합의 원소로서 식별자를 선언하는 수단을 제공한다.
enum day {SUN, MON, TUE, WED, THU, FRI, SAT};
//enum: 키워드
//day: 태그 이름, enum day 형 정의
//SUN, MON ... , SAT: 열거자
열거형의 열거자는 정수처럼 사용된다.
열거자의 값은 디폴트 첫 번째 원소가 0이고, 각 원소는 이전 원소의 값보다 하나 큰 값을 가진다.
enum day{SUN, MON, TUE, WED, THU, FRI, SAT};
//SUN:0, MON:1, TUE: 2 ...
printf("%d\n", SUN); //0이 출력된다
열거자를 다른 값으로 초기화 할 수 있다.
-초기화가 없는 열거자는 앞 열거자보다 1 큰 값을 가진다.
enum month{Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
// Jan :1, Feb:2...
enum fruit {apple=7, pear, orange =3, lemon};
//apple:7, pear:8, orange:3...
enum veg{beet = 17, carrot=17, corn=17};
열거형 변수
//이미 정의된 열거형으로 변수 선언
enum day d1, d2;
//열거형 선언과 함께 변수 선언
enum day {SUN, MON, TUE, WED, THU, FRI, SAT} d1, d2;
//태그 이름을 생략할 수 있음
enum {SUN, MON, TUE, WED, THU, FRI, SAT} d1, d2; //다시 위 형의 열거형의 변수 선언 불가능
//열거형 변수는 일반 변수와 같이 사용된다
d1 = SUN;
if(d1 == d2)
//cf 구조체는 불가능하다. 내부 원소 모두 비교를 해야한다.
[예제 프로그램]
#include <stdio.h>
enum day {SUN, MON, TUE, WED, THU, FRI, SAT};
int main(void) {
time_t now;
enum day today;
now = time(NULL); //1970년 1월 1일부터 흐른 시간(초)
today = (now/(60*60*24) +4) % 7 //1970년 1월 1일 : 목요일이니까 +4
switch(today){
case SUN:
printf("오늘은 일요일입니다.\n");
break;
case MON:
printf("오늘은 월요일 입니다.\n");
...
default:
printf("time() 함수 요류입니다.\n");
}
return0;
}
'c언어' 카테고리의 다른 글
[C언어] 전처리기 (0) | 2022.10.23 |
---|---|
[C언어] 비트 수준 접근 (0) | 2022.10.23 |
[C언어] 동적 메모리 할당 (0) | 2022.09.07 |
[C언어] 포인터와 배열 (0) | 2022.09.07 |
[C언어]포인터와 함수 (0) | 2022.09.07 |