공용체란?
C에서 같은 메모리 영역을 여러 개의 변수들이 공유할 수 있게 하는 기능을 공용체라 한다. 같은 메모리 영역을 공유하게 되면 메모리를 절약할 수 있다.
공용체를 선언하고 사용하는 방법은 구조체와 비슷하며, 구조체와 똑같은 방법으로 태그를 붙여서 사용한다. 다만 공용체는 멤버들이 같은 공간을 공유하기 때문에 동시에 모든 멤버 변수들의 값을 저장할 수는 없으며, 어떤 순간에는 하나의 멤버만 존재할 수 있다.
구조체는 각 멤버가 독립된 공간을 할당 받고, 공용체는 가장 큰 멤버의 크기만큼 메모리가 할당된다.
공용체 선언
union example {
char c;
int i;
}
여기서 union은 키워드이고 example은 공용체 태그 이름이며 변수 c와 i는 공용체의 멤버이다.
앞에서 말했듯이 공용체는 멤버들이 같은 메모리 공간을 공유하기 때문에 변수 c와 i는 같은 기억 장소를 공유한다. 즉, 특정 순간에는 문자나 정수 중 하나만 존재할 수 있다.
구조체와 마찬가지로 위 선언은 틀만 정의한 것이다.
공용체 변수 생성
공용체 변수를 생성하려면 태그 이름을 사용해 생성하면 된다.
union example v;
공용체 변수의 크기는 멤버 중에서 메모리를 가장 많이 요구하는 멤버의 크기와 같다. 따라서 공용체 example의 크기는 멤버 중에서 크기가 가장 큰 변수 i의 크기와 같게 되어 4바이트가 된다.
공용체 초기화
공용체는 한 번에 하나의 멤버만 사용되기 때문에 첫 번째 멤버만 초기화된다.
union example v = {'A'};
공용체 멤버 참조
구조체와 동일하게 멤버 연산자(.)를 사용해 멤버에 접근할 수 있다.
아래 코드는 두 개의 멤버 중 하나의 값을 변경한 후 둘 다 출력하는 코드이다. 공용체는 출력하는 순간에 둘 중 하나의 멤버만 존재할 수 있는데 어떻게 출력될까?
#include <stdio.h>
union example {
int i;
char c;
};
int main(void)
{
union example v;
v.c = 'A';
printf("v.c: %c, v.i = %d\n", v.c, v.i);
v.i = 10000;
printf("v.c: %c, v.i = %d\n", v.c, v.i);
return 0;
}
코드를 실행해보면 알겠지만 올바른 출력이 나오지 않는다. 둘 중 하나만 올바르게 출력된다. 이처럼 공용체는 한 순간에 하나의 멤버만 메모리 공간에 존재할 수 있다.
공용체의 장점
공용체는 선택된 멤버에 따라 저장된 값이 다르게 해석되기 때문에 프로그래머가 올바르게 값을 저장하고 사용해야 한다는 단점이 있다.
하지만 동일한 메모리 영역에 대하여 여러 가지 해석을 요구하는 응용 프로그램에서 유용하게 사용할 수 있다. 또한, 메모리의 같은 영역에 서로 다른 여러 가지 자료형을 사용할 수 있도록 함으로써 메모리를 절약할 수 있다.
'Study > Programming Language' 카테고리의 다른 글
[C++] cout << 을 사용해 화면 출력하기 (0) | 2024.05.03 |
---|---|
[C] typedef: typedef의 사용법과 특징, 구조체 활용 (2) | 2024.03.23 |
[C] 구조체: 구조체 정의와 구조체 변수 선언, 초기화 (1) | 2024.03.22 |
[Java] Java에서 EOF 다루는 방법 (0) | 2023.09.25 |
[Java] SimpleDateFormat: 날짜를 내 마음대로 다뤄보자 (0) | 2023.08.24 |