Developer

23.(C언어) 공용체, 열거형 본문

Programming Language/C

23.(C언어) 공용체, 열거형

DPhater 2020. 8. 1. 22:06

이벤엔 멤버들이 가장 큰 자료형의 공간을 공유하는 공용체를 알아보자.

공용체

공용체는 구조체와 정의방법이 똑같다. 차이점은 구조체는 멤버변수 각각이 서로 자신의 공간을 차지하고, 공용체는 멤버변수가 공간을 공유한다.

공용체의 정의는 union키워드를 사용하며 아래와 같이 정의한다.

union 공용체이름{
    자료형 멤버이름
    자료형 멤버이름
    자료형 멤버이름
};

구조체와 마찬가지로 typedef로 별칭을 지정할 수 있고, .(점)을 사용해 멤버 변수에 접근할 수 있으며, 포인터도 사용할 수 있다.물론 포인터로 멤버 변수에 접근하려면 ->(화살표) 연산자를 사용해야한다.

그럼 멤버끼리 공간을 공유한다는 말이 무슨 말인지 알아보자.

#include<stdio.h>

typedef union ex {
	char c;
	short s;
	int i;
}Ex;

int main() {
	Ex data;
	data.i =65793;
	printf("%d\n", data.c);
	printf("%d\n", data.s);
	printf("%d\n", data.i);
	printf("size: %d\n", sizeof(data));
	return 0;
}

코드1 실행 결과

공용체의 크기는 4Byte가 나왔다. 공용체에서 가장큰 자료형이 4byte이고 다른 멤버들과 메모리 공간을 공유하기 때문에 크기는 4Byte인 것이다. 그렇다면 각 멤버변수의 출력이 왜 저렇게 나왔나 확인해 보자.

data.i에 대입한 65793은 이진수로 1 0000 0001 0000 0001이다.

즉 i에 65793을 대입하면 위의 그림과 같이 된다.

그리고 아래 그림처럼 공용체 멤버끼리는 저렇게 저장된 공간을 서로 자신의 자료형 크기만큼 공유하는 것이다.

공용체 멤버

위의 그림처럼 서로 공간을 공유하기 때문에 data.c의 경우 1이 출력되고,

data.s의 경우 257이 출력되는 것이다. 사실 내 pc는 리틀 엔디언 방식이기 때문에

이렇게 표현하는게 더 맞는 표현일 것이다. 리틀엔디언은 1바이트 씩 쪼개서 낮은 자릿수가 메모리 앞(낮은 주소)에 오도록 저장된다.  빅 엔디언의 경우 순차적으로 저장 된다. 간단하게 예시를 들어서 설명하겠다.

만약 0x12345678라는 16진수 8자리를 저장한다고 하면 빅 엔디안의 경우

빅 엔디안

와 같이 메모리에 저장되고, 리틀 엔디안의 경우

리틀 엔디안

위의 그림과 같이 낮은 자리의 수부터 1byte씩 저장한다.

열거형

열거형은 서로 연관된 상수의 집합이다.

enum 이름{
    값,
    값,
    값
};

값은 초기화 시킬 수 있다. 초기화 시키지 않으면 0부터 1씩 증가되며 할당된다.

코드를 통해 열거형을 어떤식으로 사용하는지 알아보자

#include<stdio.h>

typedef enum value {
	valuea=0,
	valueb,
	valuec,
	valued,
}value;

int main(){
	value val;
	val = valuec;
	switch (val) {
	case valuea:
		printf("a입니다.\n");
		break;
	case valueb:
		printf("b입니다.\n");
		break;
	case valuec:
		printf("c입니다.\n");
		break;
	case valued:
		printf("d입니다.\n");
		break;
	default:
		break;
	}
	return 0;
}

코드2 실행 결과

enum 변수인 val을 선언해 val에 valuec를 저장했다.

위의 코드의 경우 그렇게 쓸모가 있어보이지는 않지만 요일이나 게임을 만들때 연관된 동작 혹은 스테이터스 정보등을 접근할 때 enum으로 묶어서 접근하면 편할 수 있다.

typedef enum value {
	valuea=0,
	valueb,
	valuec,
	valued,
}value;

valuea을 a로 초기화 했으므로 b는1 c는 2 d는 3이된다. 아무것도 초기화 해주지 않았을때와 같다.

typedef enum value {
	valuea=3,
	valueb=6,
	valuec=7,
	valued=9,
}value;

불규칙적인 값을 사용하려면 모든 열거형 값에 정수를 할당하면된다.

'Programming Language > C' 카테고리의 다른 글

25.(C언어) 함수(1)  (0) 2020.08.01
24.(C언어) 지역변수와 전역변수  (0) 2020.08.01
22.(C언어) 구조체(3)  (0) 2020.08.01
21.(C언어) 구조체(2)  (0) 2020.08.01
20.(C언어) 구조체(1)  (0) 2020.08.01
Comments