공용체(Union)
많이 사용하는 것은 아니지만 C언어에서 제공하는 것들 중 하나입니다.
공용체는 구조체와 비슷하지만 구조체와 달리 메모리를 '공유'합니다.
예를 들어보면
struct A
{
int i;
char j;
};
구조체는 이와 같이 int i와 char j가 차지하고 있는 메모리는 독립적입니다. 저희가 알고있는 것과 같죠.
그렇다는 공용체는?
union A
{
int i;
char j;
};
위 그림처럼 각 멤버들의 시작주소는 동일합니다. 즉 메모리를 공유하고있습니다.
테스트해보기 위해 코드를 보겠습니다.
#include <stdio.h>
union A {
int i;
char j;
};
int main() {
union A a;
a.i = 0x12345678; // 4바이트
printf("%x", a.j);
return 0;
}
오! 진짜 공유하는 것은 확인이 되었습니다!!! 하지만
위 코드를 컴파일하면 0x12가 아닌 0x78이 나오게 됩니다.
그 이유는 컴퓨터의 바이트 정렬 방식에 있습니다.
빅 엔디안(Big Endian)
int i에 0x12345678을 대입한다면 메모리는 이럴 것 같습니다.
위와 같이 상위비트부터 낮은 주소 값에 넣는 것을 빅 엔디안이라고 합니다.
예전 RISC 계열의 컴퓨터에서는 빅 엔디안 방식을 사용했다고 합니다.
하지만 최근 저희의 컴퓨터는 리틀 엔디안 방식을 사용합니다.
리틀 엔디안(Little Endian)
리틀 엔디안은 위와 같이 상위비트부터 높은 주소 값에 들어간 것을 알 수 있습니다.
(메모리는 1바이트를 기준으로 배치되기 때문에 0x12가 0x21로 보관되지는 않습니다.)
Windows 프로세서는 대부분 리틀 엔디안 방식을 적용하고 있습니다. 따라서 위의 공용체 예시에서 0x78이 나오게 된 것 입니다.
Union은 어떤 형의 변수가 들어올지 모를 때 공간을 효과적으로 쓰기 위해서라면 효율적일 것 같습니다.
-> 찾아보니 정말 '구조체는 데이터를 효율적으로 쓰기 위하여 사용하고 공용체는 특정 공간을 효율적으로 쓰기 위하여'라는 구절을 봤습니다!
'C,C++' 카테고리의 다른 글
[C++] 7569번: 토마토 (0) | 2024.03.21 |
---|---|
많은 수의 전역변수를 선언하면 안될까? (0) | 2022.09.07 |