본문 바로가기

Data Structure [C]/문돌이도 할 수 있는 [C언어 자료구조]

#16 [C 자료구조] 열거형(enum)과 공용체(union)

열거형에 대하여

 

변수가 가질 수 있는 값들을 미리 열거 해놓은 자료형이 있다.

예를 들어 일주일은 월화수목금토일 만 있으면 되고, 1년은 1월부터 12월까지만 있으면 된다.

이러한 자료형을 enumeration 줄여서 enum(열거형) 이라고 한다.

예시는 다음과 같다.

이를 활용해 숫자를 입력하면 TV가 선택되는 코드를 짜보자.

#include <stdio.h>
enum type { tube, lcd, plasma, projection };
int main(void) {
	enum type num;
	while (1) {
    	printf("TV 종류(코드) : ");
		scanf("%d",&num );

		switch( num ) {
			case tube:
				printf("브라운관 TV 선택!\n\n");
				break;
			case lcd:
				printf("LCD TV 선택!\n\n");
				break;
			case plasma:
				printf("PDP TV 선택!\n\n");
				break;
			case projection:
				printf("프로젝션 TV 선택!\n\n");
				break;
			default:
				printf("잘못 선택함!\n\n");
				break;
		}
	}
}

enum 으로 지정된 num 변수(실제로 type변수와 같은 배열)에서 사용자가 0~3사이의 숫자를 입력하면 그에 상응하는 type내 인자를 출력한다. 따로 지정하지 않는한 enum type안 인자들의 위치는 배열과 같은 위치값 (0 ~ n-1)을 지닌다.

따라서 switch(0)과 case tube가 상응할 수 있는 것이다.

 

다음은 숫자를 입력받아 계절에 맞는 레저활동을 출력하는 식이다.

#include <stdio.h>
enum season { spring, summer, fall, winter };
int main(void) {
	enum season ss;
	char la[10];
    while (1) {
    	printf("값 입력: ");
		scanf("%d",&ss );

		switch( num ) {
			case 0:
				strcpy(la, "inline"; break;
				break;
			case 1:
				strcpy(la, "soccer"; break;
				break;
			case 2:
				strcpy(la, "basketball"; break;
				break;
			case 3:
				strcpy(la, "swimming"; break;
				break;
			printf("레저활동 : %s\n", la);
		}
	}
}

여기서 enum season은 실제로 외부로 노출되지 않는다. strcpy를 이용해 문자열을 복사해 그에 맞는 운동을 꺼내는 코드다.

 

공용체에 대하여

공용체는 같은 메모리 영역을 여러 개의 변수가 공유하는 것으로 느낌을 보면 다음과 같다.

union example{
    char c;
    int i;
};
union example ex

위 식이 도형을 나타내는 함수다.즉 저기서 c와 i는 1개의 byte를 공유하는데, char이 1바이트를 차지하고 int가 4byte를 차지하기 때문이다. double 변수 같은 경우는 8byte를 차지하기에 이 경우 또한 부분적으로 공유하는게 가능해진다.

메모리 공간을 공용으로 사용함으로써 메모리 공간을 효과적으로 줄일 수 있다. 이론적으론!

그러나 데이터 변질 위험성이 존재한다.

 

Union들을 구조체나 배열과 동일한 느낌으로 사용할 수 있다.

#include <stdio.h>
union student{
	int num;
	double grade;
};
int main(void) {
	union student s = {315};
	printf("%d\n", sizeof(s));
	printf("학번 : %d\n", s.num);
	printf("학점 : %.1lf\n", s.grade);
	s.grade = 4.4;
	printf("학번 : %d\n", s.num);
	printf("학점 : %.1lf\n", s.grade);
	return 0;
}

구조체와 똑같쥬? 

그러나 자주 쓰이진 않는다. 하지만 자료구조에서 자주 등장하니 참고해둘 것!