티스토리 뷰

 공용체(union)를 학습하기 전에 먼저 구조체에 대한 부분이 학습이 되어 있어야 한다. 구조체 포스팅에서 다뤘던 human 구조체를 기본으로 공용체를 설명하려 한다. 먼저 공용체가 등장한 기본 아이디어부터 살펴보도록 하자.


 human이라는 구조체를 남자와 여자로 구분하려 한다. 남자라면, 수염이 있는지 없는지 여부를 물을 수 있을 것이고 여자라면, 아이가 몇 명 있는지 등의 질문을 할 수 있을 것이다. 


 구분하는 방법은 다양하다. 주민번호 앞자리가 1인지 2인지에 따라 구분할 수도 있을 것이다. 그러나 항상 비교연산 등을 통해야 여부를 알 수 있으므로 이렇게 비교하는 건 불편하다. 더 쉽게 구분할 수 있는 방법은 없을까?


 위의 아이디어로부터 등장한 개념이 바로 공용체(union)다. 공용체의 선언은 구조체와 비슷하지만, 공용체의 항목(fileds)은 반드시 메모리 공간을 공유해야 한다. 이 말인 즉슨, 사용할 때 활성화(active)되어 있는 항목(field) 단 한 가지만  사용할 수 있다는 뜻이다. human은 남자와 여자라는 정보를 둘 다 가지고 있지만, 사용되는 순간에는 남자 혹은 여자 이렇게 둘 중 하나로만 결정된다는 뜻이다. 아래의 예시를 통해 공용체에 대한 감을 잡아보자.

typedef struct {
	enum tagField {female, male} sex;
	union {
		int children;
		int beard;
	} u;
} sexType;

typedef struct {
	char name[10];
	int age;
	float salary;
	sexType sexInfo;
} human;

human person1, person2;

 기존의 human 구조체를 위와 같이 변경해보았다. 성별을 구분할 수 있는 구조체 sexType이 human 안에 들어가 있다. sexType 안에는 enum tagField로 선언된 여자, 남자 영역이 있다. 아래의 사용법을 통해 왜 이렇게 정의했는지를 생각해보자.

	person1.sexInfo.sex = male;
	person1.sexInfo.u.beard = FALSE;

	person2.sexInfo.sex = female;
	person2.sexInfo.u.children = 4;

tagField를 둠으로써 우리는 성별을 구분할 수 있는 값을 줄 수 있다. tagField를 통해 활성화된 영역을 확인한 후 우리는 올바른 항목(field)에 값을 줄 수 있는 것이다. 하지만 사실 이렇게 구분하는 것을 문법적으로 명확하게 구분할 수 있는 방법은 C에 존재하지 않는다. 일례로 만약 남자 영역이 활성화 되었어도 child 영역에 값을 줄 수 있다.


 제약이 강한 문법으로 정의되지도 않았고 실제로 위의 문장처럼 제멋대로 값을 쓸 수 있게 되어 있지만, 개념적으로 내용을 분리하기 위해 tagField 개념이 사용됐다고 생각하면 된다. 일종의 가상의 안전 장치를 두는 셈이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday