014. UNION, ENUM, BIT FIELDS

Posted on by pkchan

014-01 // UNION

UNION은 공용체입니다. 구조체와 모든 것이 같고, 메모리에 할당되는 구조가 다릅니다. 가장 큰 멤버 기준으로 메모리에 할당되며, 모든 멤버들이 공용으로 사용합니다.

union union_name {

          data_type member1;
          data_type member2;
          .
          .
          data_type member;

};

멤버들이 공용으로 메모리 영역을 사용하기 때문에 하나의 멤버 값만을 저장합니다. 첫 번째 멤버의 값이 대입되고, 두 번째 멤버의 값이 대입되면 첫 번째 멤버의 값은 지워집니다.

/*
 example 014-01
 C language union
*/

#include <stdio.h>

union data {
          char a;
          int x;
          float f;
} myData;

int main() {
          
          int mode = 1;
          
          myData.a = 'A';
          printf("Here is the Data:\n%c\n%i\n%.3f\n", myData.a, myData.x, myData.f );

          myData.x = 42;
          mode = 2;
          printf("Here is the Data:\n%c\n%i\n%.3f\n", myData.a, myData.x, myData.f );

          myData.f = 101.357;
          mode = 3;
          printf("Here is the Data:\n%c\n%i\n%.3f\n", myData.a, myData.x, myData.f );
          
          if( mode == 1 )
                    printf("The char is being used\n");
          else if( mode == 2 )
                    printf("The int is being used\n");
          else if( mode == 3 )
                    printf("The float is being used\n");
          
          return 0;
          
}

014-02 // ENUM

ENUM은 열거형입니다. 유니언과 함께 자주 쓰이지는 않지만 알아둘 필요는 있습니다. 코드를 짜다 보면 수를 대입시켜 특정 단어를 표현합니다. 예를 들면 남자는 1 여자는 2로 대입시켜 조건문에 사용할 때가 있습니다. 이런 상황에 숫자를 계속 사용하다 보면 코드가 길어질수록 헛갈리기 마련입니다. 문자를 문자 그대로 사용할 수 있도록 도와주는 것이 열거형입니다.

enum { word1, word2, word3 };

word1은 0으로 치환되며 순차적으로 word2는 1, word3는 2로 치환됩니다. enum { male = 3, female }; 과 같이 선언한다면 female은 4로 치환됩니다.
if ( gender == 3 ) 과 같이 쓰던것이 if ( gender == male ) 로 사용됩니다.

014-02 // BIT FIELDS STRUCTURE

비트 단위로 멤버를 구성하는 구조체로서 메모리 관리가 필요할때 사용하는 구조체입니다.

struct strycture_name {

          data_type member1 :3;
          data_type member2 :7;
          .
          .
          data_type member :3;

};

멤버를 정의할때 콜론과 사용할 비트수를 같이 정의해줍니다. 비트단위의 자료는 음수를 사용하지 않기때문에 양수만 사용하는 unsigned를 붙여서 선언합니다. 또한 자료형은 비트단위 메모리할당을 위한 기초 영역으로 사용됩니다. unsigned int 로 설정했다면 메모리에는 4bytes의 공간이 할당되고 그 안에서 각 멤버의 비트별로 나누어 할당됩니다. 대입되는 자료가 할당된 비트영역을 넘어가면 넘어가는 부분이 잘리거나 0으로 초기화됩니다.

/*
 example 014-02
 C language bit fields structure
*/

#include <stdio.h>

struct {
          unsigned int age : 3;
} Age;

int main( ) {

          Age.age = 4;
          printf( "Age.age : %d\n", Age.age );

          Age.age = 7;
          printf( "Age.age : %d\n", Age.age );

          Age.age = 8;
          printf( "Age.age : %d\n", Age.age );

          return 0;

}

Leave a Reply