Study/C++

[C++]04.5,6 복합데이터형 - 공용체, 열거체

SigmoidFunction 2023. 3. 29. 14:14
728x90

공용체

공용체(union)는 서로 다른 데이터형을 한번에 한가지만 보관할 수 있는 데이터 형식이다.

 

구조체는 int형과 long형, double형을 한번에 보관할 수 있지만 공용체는 어느 하나만 보관할 수 있다.

구문은 구조체와 같지만 의미가 다르다.

 

union one4all
{
	int int_val;
    long long_val;
    double double_val;
};

이 경우 one4all은 모든 형을 보관할 수 있지만 어느 순간에는 하나만 보관이 가능하다.

 

one4all pail;
pail.int_val = 15;		// int형을 저장
cout << pail.int_val;
pail.doubal_val = 1.38;	// double형을 저장, int형 값은 소실
cout << pail.double_val;

공용체는 한번에 하나의 값만 보관할 수 있으니 가장 큰 멤버를 보관할 수 있을 만큼의 공간이 필요하다.

여러가지 데이터형을 사용할 수는 있지만 이들을 동시에 사용할 수 없을 때, 공용체를 사용하면 메모리를 절약할 수 있다.

 

 

열거체

C++의 enum기능은 const를 사용하여 기호 상수를 만드는 것에 대한 또 다른 방법을 제공한다.

enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
  • spectrum을 새로운 데이터형의 이름으로 만든다. struct형 변수를 구조체라 부르듯, enum형 변수는 열거체(enumeration)라고 부른다.
  • red, orange, yellow ... 등을 0~7까지의 정수 값을 각각 나타내는 기호상수로 만들고 이 상수들을 열거자(enumerator)라고 부른다. 

아래 예시를 참고해보자

spectrum band;

// 맞는 구문
band = blue;        // blue는 열거자
band = orange;      
int color = blue;   // spectrum형이 int형으로 승급된다.
color = 3 + red;    // red가 int형으로 변환된다.

// 틀린 구문
band = 2000;        // 2000은 열거자가 아니다.
++band;             
band = orange + red;    // 안된다. 
band = 3;           // int형이 spectrum형으로 변환되지 않는다.

band = orange + red는 산술 수식에서 정수로 변환되서 1+0으로 계산되지만 int형은 spectrum 형으로 변환될 수 없기 때문에 안되는 것!

 

 

열거자의 값을 명시적으로 지정할 수 도 있다. 

enum bits {one = 1, two = 2, ten =10 , three};

이 경우 뒤에 오는 열거자는 바로 앞의 열거자의 값보다 1크다. three는 11이다.

 

myflag = bits(7);

bits는 1~11까지 있으니 열거자 값은 없지만 열거체가 정의하는 범위 안에 들어가 있으니 올바른 구문이 된다.

728x90