본문 바로가기
컴퓨터 공학/C, C++

[ C ]커스텀 자료형 이해하기5_공용체(Union Type)이란? 정의/사용하는 이유

by hahehohoo 2020. 7. 24.
반응형

 

C언어 공용체(Union Type)이란? 정의/사용하는 이유

 

 

■ 공용체 정의

공용체(Union Type)을 뜻하는 Union은 조합, 통합을 의미합니다. 무엇에 관한 '통합'일까요? 구조체와 공용체의 차이를 보면 쉽게 이해할 수 있습니다. 아래 코드를 확인해보겠습니다. 

 

#include <studio.h>

typedef struct structBox 
{
   int member1;
   int member2;
   double member3;
} SBox;

typedef union unionBox 
{
   int member1;
   int member2;
   double member3;
} UBox;

int main(void)
{
   SBox sbox;
   UBox ubox;
   printf("%d \n", sizeof(SBox); // 결과 16
   printf("%d \n", sizeof(UBox); // 결과 8
   return 0;
}

 

 

struct으로 선언된 SBox는 모든 멤버의 크기를 합한 결과(4+4+8)이고, union으로 선언된 UBox는 가장 크기가 큰 double(8)의 크기만 계산된 결과입니다. 즉, 공용체 경우는 공용체를 구성하는 각 멤버를 위해 메모리가 할당되지 않고, 그 중 가장 크기가 큰 멤버의 변수 하나만 할당하여 공유합니다. 

 

 

 

 

■ 공용체를 사용하는 이유

 

공용체로 정의한 변수는 하나의 메모리 공간을 여러 방식으로 접근할 수 있습니다. 즉 메모리는 공유하고 싶은데 들어가서 다르게 해석하고 싶을 때 사용할 수 있습니다. 예제 코드를 보겠습니다. 

typedef union {
   unsigned char val;
   struct {
      unsigned char b0 : 1;
      unsigned char b1 : 1;
      unsigned char b2 : 1;
      unsigned char b3 : 1;
      unsigned char b4 : 1;
      unsigned char b5 : 1;
      unsigned char b6 : 1;
      unsigned char b7 : 1;
   } bits;
} bitflags_t;

bitflags_t flags = {0, };

      
int is_same;
int is_zero;
bitflags_t flags = {0, };

flags.bits.b1 = 1;
flags.bits.b4 = 1;

is_same = (flags.bits.b1 == flags.bits.b7);
is_zero = (flags.val == 0);

 

 

공용체 이름은 bitflags_t 이름입니다. 아래 코드에서 공용체 bitflags_t 선언으로 flags 변수를 정의하고 0으로 초기화하였습니다. 공용체는 안에 여러 데이터가 있어도 메모리 공간을 각각 따로 잡지 않습니다. 그래서 val과 bits는 시작하는 위치가 같습니다. 둘 다 포인터이고, 다 같은 위치를 가리키고 있습니다. 이렇게 공용체를 통해 어떻게 접근하냐에 따라 통째로 읽을지 비트단위로 읽을지 정할 수 있습니다. 

 

 

 

 

 

 

-----------------------------------

C언어 문법 총정리

목록 보러가기 

-----------------------------------

 

 

반응형


댓글