C언어 공용체 (Union)
반응형

Union과 Structure의 차이점

공용체(Union)는 구조체(Structure)와 선언 및 정의의 문법적 구조가 비슷합니다.하지만 한 가지 다른 점이 있습니다. 그것은 메모리 공간을 사용하는 방법이 다릅니다.

구조체는 각 멤버에 메모리 공간이 할당되고 총 구조체 크기는 이를 합한 크기입니다. 하지만 공용체 경우는 멤버 중 가장 큰 멤버의 크기로 공용체 크기가 결정되고 각 멤버가 메모리를 공유합니다.

위 그림에서 보는 것과 같이 공용체의 멤버는 같은 메모리 공간을 사용합니다. 즉 동시에 모든 멤버를 처리할 수 없음을 의미합니다.

공용체 정의

union item
{
    int m;
    float x;
    char c;
}It1;

union 키워드를 사용하여 공용체를 정의합니다. 데이터 타입이 다른 m, x, c 멤버를 가진 공용체를 선언하였고 동시에 It1 공용체 변수를 정의하였습니다. 여기서 중요한 것은 모든 멤버가 공통된 하나의 메모리 공간을 사용한다는 것입니다. 즉 멤버를 사용할 때 오직 한 번에 하나씩만 사용할 수 있다는 의미입니다.

공용체 멤버 접근 방법

union test
{
    int a;
    float b;
    char c;
}t;

t.a;  
t.b;     
t.c;

공용체 멤버 사용 예제

#include <stdio.h>

union item
{
    int a;
    float b;
    char ch;
};

int main( )
{
    union item it;
    it.a = 12;
    it.b = 20.2;
    it.ch = 'z';
    
    printf("%d\n", it.a);
    printf("%f\n", it.b);
    printf("%c\n", it.ch);
    
    return 0;
}

OUTPUT
1101109626 //쓰레기 값 출력
20.199940  //쓰레기 값 출력
z          //원하는 값 출력

위의 예제는 공용체 멤버가 오직 한 번에 하나의 멤버만 처리하는 것을 보여주는 예제입니다. 공용체 item을 선언하고 공용체 변수 it를 정의하였습니다. 그리고 각 멤버에 값을 넣은 후 출력하는 예제입니다. 그리고 오직 마지막 값인 it.ch만 제대로 출력되었습니다.

모든 값을 각 멤버에 할당하였어도 공통된 메모리 공간을 사용하기 때문에 제일 마지막에 할당된 ‘z’가 저장되어있고 출력할 때 마지막 값만 제대로 출력된 것입니다.

공용체는 일반적으로 자주 쓰이지는 않지만 특별한 코드를 작성할 때 자주 쓰인다고 합니다. (임베디드, 디바이스 드라이버 등등)

<< 다음 혼자 공부하는 C언어 이전 >>
반응형

'프로그래밍 > C' 카테고리의 다른 글

포인터 변수 사용 방법  (0) 2019.12.20
C언어 포인터  (0) 2019.12.20
typedef 별칭(Alias) 주기  (0) 2019.12.19
C언어 구조체 (Structure)  (0) 2019.12.19
배열을 함수의 매개변수로 사용하기  (0) 2019.12.19