공용체는 얼핏 보면 구조체와 비슷하지만 메모리를 사용하는 게 다릅니다.
구조체는 멤버들이 각각 메모리를 할당해주지만, 공용체는 멤버 변수 중 메모리 크기가 가장 큰
만큼만 할당됩니다.
할당된 메모리를 모든 멤버 변수가 공유를 하기때문에 모든 멤버 변수들의 값을 저장할 수 없는 경우도 있습니다.
정의 및 선언방법, 사용방법은 구조체와 비슷합니다.
대신 공용체는 struct가 아니라 union을 사용합니다.
union 공용체이름 {
//멤버 자료형 이름;
자료형 이름;
자료형 이름;
자료형 이름;
.
.
.
};
union 구조체이름 변수이름;
그러면 구조체와 공용체의 차이점을 예제를 통해 보겠습니다.
#include <stdio.h>
union uni_1 {
char st[30];
int num;
float num2;
};
struct str_1 {
char st[30];
int num;
float num2;
};
int main(void) {
union uni_1 u;
struct str_1 s;
printf("u의 크기 = %d \n",sizeof(u));
printf("s의 크기 = %d \n", sizeof(s));
return 0;
}
union uni_1 u;의 크기는 32 struct str_1 s;의 크기는 40이 나왔습니다.
자세히 보면 union의 가장큰 크기와 struct의 메모리의 합의 크기가 다른 점 이 있습니다.
여기서 하나 알고 넘어갈 점이 패딩입니다.
구조체나 공용체는 정렬을 할 때 가장 큰 메모리 크기의 기준으로 정렬을 합니다.
int num;이 4byte로 가장 크기 때문에 4byte 기준으로 정렬을 하면 char st[30];가 2byte만큼 사용하지 않는 공간이 발생하는데 여길 채워주는 값을 패딩이라고 합니다. 그래서 구조체나 공용체는 sizeof()를 사용했을 때 크기가 더 크게 표시되는 경우가 있습니다.
이제 공용체가 메모리를 공유하는지를 예제를 통해 확인해보겠습니다.
#include <stdio.h>
union uni_1 {
int num1;
int num2;
int num3;
};
int main(void) {
union uni_1 u;
u.num1 = 4;
printf("%d \n", u.num1);
printf("%d \n", u.num2);
printf("%d \n", u.num3);
return 0;
}
공용체 선언 후 첫 번째 멤버 변수만 값을 대입했지만
모든 멤버 변수들이 값이 같은걸 볼 수 있습니다.
구조체에서 이런 식으로 출력을 하면 에러가 발생합니다. 하지만 공용체는 메모리를 공유하기 때문에 한 멤버 변수에 저장하면 다른 멤버 변수들도 영향을 받게 됩니다.
공용체는 메모리를 효율적으로 관리하기 위해서 많이 사용합니다.
'공부 자료실 > C언어' 카테고리의 다른 글
C언어 - typedef (0) | 2020.07.02 |
---|---|
C언어 - 열거형 (0) | 2020.07.02 |
C언어 - 문자열 변환 (0) | 2020.06.30 |
C언어 - 문자,문자열의 입력, 출력 (0) | 2020.06.30 |
C언어 - 문자열과 포인터 (0) | 2020.06.29 |
댓글