..

Search

43) 공용체와 열거체

43) 공용체와 열거체

공용체와 열거체


공용체

공용체(union)는 union 키워드를 사용하여 선언하며, 한 가지를 제외한 모든 면에서 구조체와 같습니다.

바로 모든 멤버 변수가 하나의 메모리 공간을 공유한다는 점만이 다릅니다.

모든 멤버 변수가 같은 메모리를 공유하므로, 공용체는 한 번에 하나의 멤버 변수밖에 사용할 수 없습니다.

 

공용체공용체

 

공용체는 순서가 규칙적이지 않고, 미리 알 수 없는 다양한 타입의 데이터를 저장할 수 있도록 설계된 타입입니다.

이러한 공용체는 크기가 가장 큰 멤버 변수의 크기로 메모리를 할당받습니다.

따라서 공용체 배열을 사용하면, 같은 크기로 구성된 배열 요소에 다양한 크기의 데이터를 저장할 수 있습니다.

 

다음 예제는 공용체의 멤버 변수를 단 하나만 초기화해도, 나머지 멤버 변수들이 모두 같은 데이터를 공유한다는 것을 보여주는 예제입니다.

예제

typedef union

{

    unsigned char a;

    unsigned short b;

    unsigned int c;

} SHAREDATA;

 

int main(void)

{

    SHAREDATA var;

    var.c = 0x12345678;  

 

    printf("%x\n", var.a);

    printf("%x\n", var.b);

    printf("%x\n", var.c);

    return 0;

}

코딩연습 ▶

실행 결과

78

5678

12345678

 

공용체에 저장된 값의 의미는 값을 저장할 때 공용체의 어떤 멤버 변수를 사용했는지에 따라 전혀 달리 해석됩니다.

따라서 공용체의 어떤 멤버 변수를 사용하여 저장했는지를 별도로 저장하여, 접근할 때에도 같은 멤버 변수를 사용해야 합니다.


열거체

열거체(enumerated types)는 새로운 타입을 선언하면서, 동시에 해당 타입이 가질 수 있는 정수형 상숫값도 같이 명시할 수 있는 타입입니다.

이러한 열거체를 이용하면 프로그램의 가독성이 높아지고, 변수가 지니는 값에 의미를 부여할 수도 있게 됩니다.

 

예제

enum Weather {SUNNY = 0, CLOUD = 10, RAIN = 20, SNOW = 30};  

int main(void)

{

    enum Weather wt;  

    wt = SUNNY;  

 

    switch (wt)

    {

        case SUNNY:

            puts("오늘은 햇볕이 쨍쨍!");

            break;

        case CLOUD:

            puts("비가 올락말락하네요!");

            break;

        case RAIN:

            puts("비가 내려요.. 우산 챙기세요!");

            break;

        case SNOW:

            puts("오늘은 눈싸움하는 날!");

            break;

        default: puts("도대체 무슨 날씨인건가요!!!");

    }  

 

    puts("각각의 열거체에 해당하는 정수값은 다음과 같습니다.");

    printf("%d %d %d %d\n", SUNNY, CLOUD, RAIN, SNOW);

    return 0;

}

코딩연습 ▶

실행 결과

오늘은 햇볕이 쨍쨍!

각각의 열거체 멤버에 해당하는 정수값은 다음과 같습니다.

0 10 20 30

 

C언어에서 열거체는 enum 키워드를 사용하여 선언합니다.

위의 예제처럼 사용자가 별도로 각 멤버에 해당하는 상숫값을 명시할 수 있습니다.

이때 상숫값을 따로 명시하지 않으면 0부터 시작되며, 그 다음 멤버의 값은 바로 앞 멤버의 값보다 1만큼 증가되며 정의됩니다.

 

예제

enum Days {MON, TUE, WED, THU, FRI, SAT, SUN};  

int main(void)

{

    enum Days today;  

    today = SAT;  

 

    if (today >= SAT && today <= SUN)

    {

        puts("오늘은 주말이네요~ 주말에도 열심히 공부하는 여러분은 최고에요!");

    }

    else

    {

        printf("주말까지 %d일 남았어요~ 조금만 더 힘내자구요!", 5 - today);

    }

 

    puts("각각의 열거체에 해당하는 정수값은 다음과 같습니다.");

    printf("%d %d %d %d %d %d %d\n", MON, TUE, WED, THU, FRI, SAT, SUN);

    return 0;

}

코딩연습 ▶

실행 결과

오늘은 주말이네요~ 주말에도 열심히 공부하는 여러분은 최고에요!

각각의 열거체 멤버에 해당하는 정수값은 다음과 같습니다.

0 1 2 3 4 5 6


연습문제