본문 바로가기

etc..

Union을 사용하는 경우

예전에 저학년때 union 이라는 요상한놈을 배우고는 이걸 어디써먹지? 그냥 예전에 쓰던 방식이고
이제는 안쓰는 오래된(legacy) 형식인가 싶었다.
요즘 컴파일러를 구현하는데 공간을 효율적으로 쓰기위해 떠올려보니 요 놈이 있었다.
예를들어 함수의 파라미터로 넘어오는 인자의 형이 int, double, char 중에 한 놈이라고 가정한다면,
컴파일러를 만드는 과정에서 이를 저장하는 심볼테이블을 짜야되는데 입력으로 셋 중 어느 형이 들어올지를
모르니 구현하는 입장에서 세가지 경우를 다 상정하고 int, double, char 형 저장공간을 다 마련하는 수 밖에 없다.

struct sym_table{
     int iValue;
    double dValue;
    char  cValue;
};//9바이트

하지만 union을 사용하여
union{
int iValue;
double dValue; 
char cValue;
};//4바이트

등으로 사용해서 쓴다면, 훨씬 저장공간을 절약할 수 있다.

이 외에도 통신에서 union을 자주 사용한다.

---------------------이하  http://whip.tistory.com/41  에서 펌--------------------------------------
struct(구조체) 는 데이터를 효율적으로 처리하기 위해서 사용되기 위해서 사용 합니다.
union 은 단지 특정 공간을 효율적으로 관리하기 위해서 사용합니다.
공용체는 다른 사람이 공용체를 왜 사용하는지에 대한 질문이 있어서 대답을 제가 올린 것이 있는데 그것으로 대체 합니다.
-----------------------------------------------------------------------------

공용체를 사용하는 곳은 많습니다. 일반적으로 많이 사용하는 곳은 통신쪽 입니다. prototype 을 정의하다보면 어떤 경우에는 필요하고 어떤 경우에는 필요하지 않는 부분이 있는데 보통 이런 부분을 공용체를 이용 합니다. 특히 통신쪽은 사이즈가 되도록이면 적게설계하는 것이 원칙 입니다. 그래서 많이 사용합니다. 그리고 Transaction 을 DB 가 아닌 일반 flat 파일로 구현할 때도 마찬가지 입니다. Transaction 은 일반적으로 통신에서 처리된 데이터를 저장하는 경우가 많으니까요 ...

//주민번호
typedef struct
{
char number1[6];    //주민번호 앞에것
char number2[7];    //주민번호 뒤에것
}City_Number;

union 
{
char name[20];             //이름
City_Number Number;    //주민번호 
}Info;

예를 들어 이름이 입력되면 주민증록번호를 입력하지 않고,
주민등록번호를 입력하면 이름을 입력하지 않도록 처리 한다고 가정 합시다.
(단지 이해를 위해서 가정을 세웠습니다. 꼭 그렇다는 얘기는 아니고 ...^^)

그러면 일단 이름이 들어갈 공간이 필요하고, 또 주민등록번호가
입력될 경우를 대비해서는 주민번호 입력할 공간이 필요 합니다.
이름은 일단 20 Bytes 로 가정하면
char name[20] 으로 가능하고

주민번호는 City_Number 에 정의한대로 사용하면 됩니다.
이렇게 가정하면 20 + 6 + 7 = 33 Bytes 가 필요합니다.
그러나 Info 처럼 정의하면 20 Bytes 만 있으면 가능합니다.
같은 메모리 20 Bytes 내에서 이름을 입력할 경우는 Info.name 을 사용하면 되고 Info.Number 를 사용하면 주민번호를 저장할 수 있습니다. 이렇게 하면 통신으로 전송할 때도 33 Bytes 보다 20 Bytes 를 보내는 것이 훨씬 수월합니다. 저장할 때도 마찬가지로 사이즈를 적게 잡아 먹습니다.

아주 잘 설계된 프로그램들은 종종 union 을 많이 사용합니다. 꼭 사용할 필요는 없으나 아주 유용하다는 것만 알아 주시기 바랍니다.