공용체 union

공용체란 같은 메모리 영역을 여러 개의 변수들이 공유할 수 있게 하는 기능을 말한다.

union 키워드를 사용하여 선언하며, 공용체는 구조체와 달리 멤버들이 같은 메모리 공간을 공유하기 때문에 한 번에 하나의 멤버 변수만 사용할 수 있다.

구조체는 각 멤버가 독립된 공간을 할당받느 반면, 공용체에서는 가장 큰 멤버의 크기만큼의 메모리가 할당된다.

image.png

값을 저장할 때 공용체의 어떤 멤버 변수를 사용했는지에 따라 공용체에 저장된 값의 의미는 다르게 해석된다.

#include <iostream>

union Union {
	char c;
	short s;
	int i;
};

int main()
{
	Union Var;	

	Var.c = 'C';
	std::cout << "Var.c 의 값 : " << Var.c << std::endl;
	std::cout << "Var.s 의 값 : " << Var.s << std::endl;
	std::cout << "Var.i 의 값 : " << Var.i << std::endl;
	std::cout << std::endl;

	Var.s = 10000;
	std::cout << "Var.c 의 값 : " << Var.c << std::endl;
	std::cout << "Var.s 의 값 : " << Var.s << std::endl;
	std::cout << "Var.i 의 값 : " << Var.i << std::endl;
	std::cout << std::endl;

	Var.i = 12345678;
	std::cout << "Var.c 의 값 : " << Var.c << std::endl;
	std::cout << "Var.s 의 값 : " << Var.s << std::endl;
	std::cout << "Var.i 의 값 : " << Var.i << std::endl;
	std::cout << std::endl;

	std::cout << "Var.c 의 크기 : " << sizeof(Var.c) << std::endl;
	std::cout << "Var.s 의 크기 : " << sizeof(Var.s) << std::endl;
	std::cout << "Var.i 의 크기 : " << sizeof(Var.i) << std::endl;
	std::cout << "Var   의 크기 : " << sizeof(Var) << std::endl;

	return 0;
}
Var.c 의 값 : C
Var.s 의 값 : -13245
Var.i 의 값 : -858993597

Var.c 의 값 :
Var.s 의 값 : 10000
Var.i 의 값 : -859035888

Var.c 의 값 : N
Var.s 의 값 : 24910
Var.i 의 값 : 12345678

Var.c 의 크기 : 1
Var.s 의 크기 : 2
Var.i 의 크기 : 4
Var   의 크기 : 4

선택된 멤버에 따라 저장된 값을 각자의 자료형으로 해석되는 것을 확인할 수 있다.


열거체 enum

열거체 / 열거형 이란 변수가 가질 수 있는 값들을 나열해놓은 자료형이다. 열거체를 이용하여 새로운 변수를 선언하면서 동시에 그 변수가 가질 수 있는 정수형 상수값도 함께 명시할 수 있다.

열거체는 enum 키워드를 사용하여 정의한다.

이때 열거형 상수의 이름만 선언되어있으면 0 에서 시작하여 1 씩 증가하는 정수값으로 자동으로 설정되며, 중간에 열거형 상수의 값이 선언되지 않으면 앞서 선언된 상수보다 1 이 증가된 값이 할당된다.

#include <iostream>

enum Days
{
	MON, // 0
	TUE, // 1
	WED, // 2
	THU, // 3
	FRI, // 4
	SAT  // 5
};

enum Num
{
	ONE = 1, // 1
	TWO,	 // 2
	THR,	 // 3
	FOU,	 // 4
	FIV	     // 5
};

int main()
{
	// 열거형 변수 today
	// today는 열거형 Days에 정의된 값만을 가질 수 있습니다.
	enum Days Today;
	Today = TUE;

	int Monday = Days::MON;

	std::cout << "Today    : " << Today << std::endl;
	std::cout << "Monday   : " << Monday << std::endl;
	std::cout << "Num::ONE : " << Num::ONE << std::endl;
	std::cout << "Num::TWO : " << Num::TWO << std::endl;
	std::cout << "Num::THR : " << Num::THR << std::endl;

	return 0;
}
Today    : 1
Monday   : 0
Num::ONE : 1
Num::TWO : 2
Num::THR : 3

이러한 열거체를 이용하면 프로그램의 가독성을 높일 수 있고, 변수값에 의미를 부여할 수 있다.