c언어

[C언어] 공용체(union) / 열거형

kidmillionaire1998 2022. 10. 12. 23:39

공용체는 구조체와 비슷한 구문 형식을 가지지만 각 멤버들은 같은 기억장소를 공유한다. 

공용체 형은 메모리의 같은 위치에 저장될 여러 값의 집합을 정의한다. 

[선언] 

union short_or_float {
	short s; 
	float f; 
};

//union : 키워드
//short_or_float: 공용체 태그 이름이며, short_or_float 공용체 형을 선언한 것이다. 
//s,f : 공용체의 멤버

short_or_float 공용체 모양

- 공용체 변수는 구조체 변수와 같은 방법으로 선언이 된다. 

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