반응형
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, C++' 카테고리의 다른 글
[ C ] 파일 입출력 이해하기1_스트림 생성, 소멸, 파일 읽는 함수_fopen, fclose, fagets (421) | 2020.07.25 |
---|---|
[ C ]커스텀 자료형 이해하기6_열거형(Enumerated Type)란? 개념/선언방법 (406) | 2020.07.24 |
[ C ]커스텀 자료형 이해하기4_함수 반환값으서의 구조체 (412) | 2020.07.24 |
[ C ]커스텀 자료형 이해하기3_구조체 배열, 포인터 (374) | 2020.07.24 |
[ C ]커스텀 자료형 이해하기2_typedef이란? typedef사용법 (403) | 2020.07.24 |
댓글