Programming/C C++
공용체는 여러개의 변수를 묶는다는 개념에서 구조체와 비슷하지만 일반 변수나 구조체와는 달리 묶여있는 각각의 변수가 자신만의 Memory공간을 확보하지 않고 가능한 범위내에서 Memory를 공통적으로 사용하는 구조를 가지고 있습니다.

예를 들어 아래와 같이 세개의 변수가 존재하는 경우

int a;
int b;
int c;

a와 b, c 변수는 선언되는 즉시 Memory에서 int형 만큼의 Memory공간을 확보하게 될 것입니다. 즉, int Data형이 4byte의 Memory공간을 필요로 한다면 총 12byte의 Memory가 확보되는 것입니다.

하지만 공용체의 경우에는 Memory를 공통으로 사용한다는 개념이 적용되므로 위의 변수를 공용체로 정의하게 되면 단 4byte만이 할당되는 것으로 끝납니다. 즉 a, b, c세개의 변수에 모두 하나의 Memory공간만을 할당해 주면 되기 때문입니다.

따라서 공용체를 사용하면 Memory공간을 그 만큼 절약할 수 있게 됩니다.

공용체는 다음형식에 따라 정의됩니다.(문법적 구조는 구조체와 비슷합니다. 단지 struct를 union으로 하면 됩니다.)

union 공용체명 {
 데이터형 변수명;
};

처음 예제에서 처럼 a, b, c 세개의 변수를 공용체로 정의하면 다음과 같이 할 수 있습니다.

union sher{
    int a;
    int b;
    int c;
};

이렇게 정의된 공용체를 사용하기 위해서는 구조체와 마찬가지로 공용체의 변수선언이 필요합니다.

union sher alp;

sher공용체를 alp라는 이름의 변수로 선언합니다.

물론 공용체도 구조체처럼 정의와 동시에 변수를 선언할 수도 있습니다.

union sher{
    int a;
    int b;
    int c;
} alp;

sher공용체를 정의하고 alp라는 변수를 선언합니다.

이렇게 선언된 공용체의 Member에 접근하려면 .(점)을 사용합니다.(반면 Pointer를 통할때는 -> 연산자를 사용해야 합니다.)

#include <stdio.h>

main()
{
  union sher{
    int a;
    int b;
    int c;
  } alp;
 
  alp.a = 100;
 
  printf("sher공용체 member a의 값 : %d\n", alp.a);
}


sher공용체의 a Memer에 100값을 할당하고 printf()로 할당한 값을 확인합니다.


그런데 주의할 것이 하나 있습니다. 앞에서도 말씀드렸듯이 공용체는 특정 Memory공간을 Member끼리 공동으로 사용한다고 하였는데 이러한 특징 때문에 공용체는 한번에 단 하나의 Member에만 접근할 수 있습니다.

즉, 어떤때에는 Member a를 사용하다가 또 어떤경우에는 Member b를 사용하는 식으로 필요할 때마다 각 Member의 Data형에 맞게 번갈아 가면서 사용해야 한다는 것입니다. 이는 공용체의 모든 Member가 하나의 Memory공간만을 공유하므로 동시에 사용될 수 없는건 당연한 것입니다.

#include <stdio.h>

main()
{
  union sher{
    int a;
    int b;
    int c;
  } alp;
 
  alp.a = 100;
  alp.b = 200;
  alp.c = 300;
 
  printf("sher공용체 각 member의 값 : %d - %d - %d", alp.a, alp.b, alp.c);
}


공용체 각 Member에 100, 200, 300값을 할당하고 printf()로 각 Member에 할당한 값을  동시에 확인하려고 합니다.


물론 위와 같은 방법 이외에도 공용체는 구조체와 같은 방식으로 {}를 이용하여 값을 초기화 할 수 있습니다.

#include <stdio.h>

main()
{
  union sher{
    int a;
    int b;
    int c;
  };
 
  printf("sher공용체 각 member의 값 : %d - %d - %d", alp.a, alp.b, alp.c);
}


그러나 이 경우도 값은 하나만 지정 할 수 있습니다. Memory를 공동으로 사용한다는 특징때문에 여러개의 값을 가질 수 없으니 당연한 것이지요.

공용체 sher이 메모리 주소 1000번지에 할당되었다고 가정한다면 이 1000번지에 100값이 들어갔다가 다시 200값이 할당되고 또 다시 300값을 가지는 과정을 거치면서 최종적으로 300이라는 값만 남게 됩니다.

결국 공용체 Member a나 b, c는 모두 같은 Memory공간의 1000번지를 사용하고 있으므로 a를 확인하든 b나 c를 확인하든 같은 결과가 나타날 수 밖에 없는 것입니다.

만일 공용체의 Member가 각각 다른 Data형을 가지는 경우에는 초기값을 설정할 경우 최초의 Member형식을 따르게 됩니다.

'Programming > C C++' 카테고리의 다른 글

[C, C++] 연산자  (0) 2011.02.08
[C, C++] 제어문  (0) 2011.02.01
[C, C++] 공용체  (0) 2010.09.27
[C, C++] Volatile  (0) 2010.09.15
[C, C++] File 다루기  (0) 2010.08.13
[C, C++] Program에 인수 전달하기  (0) 2010.08.11
0 0