예전에 저학년때 union 이라는 요상한놈을 배우고는 이걸 어디써먹지? 그냥 예전에 쓰던 방식이고
이제는 안쓰는 오래된(legacy) 형식인가 싶었다.
요즘 컴파일러를 구현하는데 공간을 효율적으로 쓰기위해 떠올려보니 요 놈이 있었다.
예를들어 함수의 파라미터로 넘어오는 인자의 형이 int, double, char 중에 한 놈이라고 가정한다면,
컴파일러를 만드는 과정에서 이를 저장하는 심볼테이블을 짜야되는데 입력으로 셋 중 어느 형이 들어올지를
모르니 구현하는 입장에서 세가지 경우를 다 상정하고 int, double, char 형 저장공간을 다 마련하는 수 밖에 없다.
struct sym_table{
int iValue;
double dValue;
char cValue;
};//9바이트
하지만 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;
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 을 많이 사용합니다. 꼭 사용할 필요는 없으나 아주 유용하다는 것만 알아 주시기 바랍니다.
등으로 사용해서 쓴다면, 훨씬 저장공간을 절약할 수 있다.
이 외에도 통신에서 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 을 많이 사용합니다. 꼭 사용할 필요는 없으나 아주 유용하다는 것만 알아 주시기 바랍니다.
'etc..' 카테고리의 다른 글
c와 cpp 파일을 같이 컴파일할 때 (0) | 2011.12.18 |
---|---|
다이얼로그의 포인터 얻어오기 (0) | 2010.11.06 |
쓰레드에서 dialog 의 updatedata()쓰는법 (0) | 2010.11.06 |
프로그래밍 습관 (1) | 2010.11.06 |
컴파일시 실행코드 사이즈 줄이는법 (0) | 2010.09.27 |