지난 시간에 구조체에 대해서 살펴 보았습니다. 오늘은 유사한 공용체 변수에 대해서 살펴 볼까 합니다. 표현 방법은 구조체나 공용체나 유사합니다. 사용 방법도 유사하고요. 차이점은 구조체는 구조체 내 멤버 변수들이 메모리에 개별적으로 할당하는 반면 공용체는 메모리 공간을 공유하여 사용 한다는 점이 구조체와 공용체의 차이점입니다. 구조체에 비해 공용체는 멤버변수들이 사용하는 메모리 공간을 공유하기 때문에 메모리 할당 공간이 작습니다 언뜻 보기에 구조체로 쓰는 것보다 공용체로 쓰는게 좋겠다고 생각 할 수 있지만 문제는 메모리 공간을 공유하기 때문에 멤버변수간에 데이터를 입력 할 때 공유된 주소지를 사용하기 때문에 한쪽에 멤버변수에 입력 된 값이 있을 때 다른 멤버변수에 새로운 입력값이 입력 될 때 기존 다른 멤버에 입력된 값이 손상을 가져오게 됩니다. 그러기 때문에 공용체가 좋아 보인 듯 하지만 실상은 구조체로 대부분 코딩을 합니다.
암튼 공용체에 대해서 자세히 알아 볼까요.
우선 공용체의 표현은 다음과 같습니다.
구조체와 유사하죠.
구조체와 비교하면 struct가 union으로 바뀐 것 뿐 모든 표현은 동일 합니다. 구조체에서 쓴 typedef도 union에서도 쓸 수 있습니다.
공용체는 멤버변수들을 묶어 놓은 형태로 구조체와 유사하지만 동일한 메모리 기억공간을 사용한다는 점만 차이점입니다.
기억공간을 공유한 다는 느낌은 아래 그림과 같습니다.
어떤 느낌인지 아시겠죠. 메모리 기억 공간을 오른쪽 그림처럼 공유를 합니다. 이때 공유된 주소지에 다른 값이 입력 되면 이전 입력된 값은 손상이 가기 때문에 사용에 주의를 해야 겠지요. 이 부분은 어떻게 되는지 나중에 실행해서 보여 드리겠습니다.
struct size1{
char a;
int b;
int c;
};
union size2{
char a;
int b;
double c;
};
이렇게 선언 될 경우 사이즈를 측정해 볼까요.
struct size1 s1;
union size2 s2;
printf("s1 struct total size : %d, char : %d, int : %d, double : %d \n",sizeof(s1),sizeof(s1.a),sizeof(s1.b),sizeof(s1.c));
printf("s2 union total size : %d, char : %d, int : %d, double : %d \n",sizeof(s2),sizeof(s2.a),sizeof(s2.b),sizeof(s2.c));
[결과]
보시는 것처럼 구조체로 선언 했을 때 크기가 12byte였고 공용체로 선언된 크기가 8byte로 나와 있네요. 옆에는 각 멤버 변수의 크기들이고요. 공용체는 8byte 기억공간을 멤버 변수들이 공유하여 사용합니다. 구조체는 개별적으로 메모리 기억공간을 사용하고요. 둘의 차이점을 잘 아시겠지요.
union size{
char a;
int b;
double c;
};
union size2 s;
이렇게 정의 했을 때 이렇게 변경하면 어떤 결과를 초래 할까요.
s.b=1;
printf("%d %f\n",s.b,s.c);
s.c=2.1f;
printf("%d %f\n",s.b,s.c);
s.b=2;
printf("%d %f\n",s.b,s.c);
[결과]
이전 값이 저정된 공유 주소지에 새로운 값이 입력 되면 이전 값은 손상이 결과 처럼 발생 합니다.
위 설명한 내용들을 전체 소스로 아래와 같이 코딩 했습니다.
[전체소스]
#include
#include
struct size1{
char a;
int b;
int c;
};
union size2{
char a;
int b;
double c;
};
int main(int argc, char *argv[]) {
struct size1 s1;
union size2 s2;
printf("s1 struct total size : %d, char : %d, int : %d, double : %d \n",sizeof(s1),sizeof(s1.a),sizeof(s1.b),sizeof(s1.c));
printf("s2 union total size : %d, char : %d, int : %d, double : %d \n",sizeof(s2),sizeof(s2.a),sizeof(s2.b),sizeof(s2.c));
s2.b=1;
printf("%d %f\n",s2.b,s2.c);
s2.c=2.1f;
printf("%d %f\n",s2.b,s2.c);
s2.b=2;
printf("%d %f\n",s2.b,s2.c);
system("pause");
return 0;
}
[결과]
구조체를 배울 때 공용체가 이런 거구나 하고 알아만 두세요. 좀 더 깊게 설명해야 하는 부분이 있긴 하지만 잘 쓰지도 않는 거 너무 깊게 알아 두실 필요는 없습니다. 간단히 읽어 보시면 전체소스만 타이핑해서 실행 결과만 보시고 원리만 이해해 주세요.