C 언어

[c언어 강좌] 5. enum(열거형)

Let it out 2024. 8. 16. 12:57
반응형

- enum 이란?

enum(enumeration)은 열거된 상수별명으로 치환하여 사용하는 나열형이다.

상수 1을 ONE이라는 별명을 지어준뒤, ONE을 부르면 1의 값을 사용 할 수 있다.

 

- enum의 기본적인 형태

우선 enum을 정의해 줘야한다. enum키워드를 사용해 enum의 이름을 e라고 지정해주고

{ }; 안에 ZERO, ONE, TWO, THREE라는 별명을 적어주면 enum을 정의 할 수 있다.

별명에 초기값이 없을 경우에는 0부터 시작하여 아래로 + 1 씩 더한 값이 지정된다.

따라서 ONE, TOW, THREE, FOUR에 순서대로 0,1,2,3 상수가 알아서 지정된다.

보통 별명은 대문자로 많이 사용한다. 하지만 회사마다 다를 수 도 있다.

enum e    //이넘 정의
{
	ZERO, //0
	ONE,  //1
	TWO,  //2
	THREE //3
};

 

정의한 enum을 사용하기 위해선 enum을 선언 해줘야 한다.

enum을 선언 할 때는 enum키워드 정의한 enum 변수명; 순서대로 작성해준다.

e는 정의한 enum이고 num이 enum의 변수가된다.

enum e num;

 

enum 변수를 사용 할 때는 enum에서 정의한 값 들 중 하나만 가질 수 있게 된다.

num 변수는 ZERO, ONE, TWO, THREE 중 하나의 값만 할당 된다는 거다.

num = ZERO;
num = ONE;

 

위에서 설명한 내용의 전체 코드다.

num 변수를 이용해 상수를 출력하는 예제다.

#include <stdio.h>

enum e		//enum 정의
{
	ZERO, 
	ONE, 
	TWO, 
	THREE 
};

int main()
{
	enum e num; //enum 변수 선언
	
	num = ZERO; //enum 변수에 상수 넣기
	printf("%d\n", num); // 0

	num = ONE;
	printf("%d\n", num); // 1
}

 

결과

0
1

 

 

- enum 정의 초기값 세팅

enum을 정의 할때 초기값을 세팅 할 수 있다.RED = 3 이기 때문에 위에서 아래로 + 1 씩 3,4,5,6로 지정된다.

enum e
{
	RED = 3, //3
	BLUE,    //4
	GREEN,   //5
	YELLOW   //6
};

 

enum을 정의 할때 모든 값을 지정 할 수 있다.

enum e
{
	RED = 3,   //3
	BLUE = 4,  //4
	GREEN = 5, //5
	YELLOW = 6 //6
};

 

 

enum을 정의 할때 원하는 값만 지정 할 수 있다.

이때는 지정 한 값이 나올 때 마다 그 기준으로 + 1씩 된다.

enum e
{
	RED = 3,   //3
	BLUE,      //4
	GREEN = 8, //8
	YELLOW 	   //9
};

 

 

- typedef 사용하기

- typedef : 다른 자료형의 별명을 만들기 위한 예약어

typedef과 함께 enum을 정의하면 코드를 줄일 수 있다.

enum을 정의 할 때 첫째줄에 다가 typedef 예약어를 enum e 앞에 붙여주면 된다.

마지막 줄에 color_e라는 enum의 별명을 지어준다.

typedef enum e //e는 enum의 이름
{
	RED,
	BLUE,
	GREEN,
	YELLOW
}color_e;     //enum의 별명

 

 

기존 enum 선언 방식 대신에 enum의 별명을 이용해 enum을 선언 할 수 있게된다.

기존 enum 선언 방식을 사용해도 문제없이 선언된다.

color_e num; //color_e(별명)으로 선언

 

 

typedef을 사용한 코드의 전체 예제다.

대부분 enum과 typedef를 함께 사용하기 때문에 typedef의 사용을 권장한다.

#include <stdio.h>

typedef enum e //e는 enum의 이름
{
	RED,
	BLUE,
	GREEN,
	YELLOW
}color_e;     //enum의 별명

int main()
{
	color_e num; //별명으로 enum 선언
	num = RED;
	printf("%d\n", num);
}

 

- enum의 메모리 크기에 대해서

우선 enum을 정의하는 부분에선 메모리가 할당 되지 않는다.

enum e		//enum 정의, 메모리 할당 안됨
{
	ZERO, 
	ONE, 
	TWO, 
	THREE 
};

 

enum을 선언하는 부분에서 메모리가 할당 된다.

enum e num; //enum 변수 선언, 메모리 할당

 

enum의 크기를 알아내려면 sizeof 함수를 사용하면 된다.

결과를 보면 num의 변수는 4byte를 차지 하는 것을 알 수 있다.

enum의 값은 정수형을 별명으로 치환하기 때문에 int와 같은 크기이기 때문이다.

- sizeof 함수 : 변수의 크기를 알아내는 함수, byte로 반환

enum e num; //enum 변수 선언, 메모리 할당
printf("%d byte \n", sizeof(num)); // 4byte

결과

4 byte

 

위에서 설명한 내용의 전체 코드다.

#include <stdio.h>

enum e		//enum 정의, 메모리 할당 안됨
{
	ZERO, 
	ONE, 
	TWO, 
	THREE 
};

int main()
{
	enum e num; //enum 변수 선언, 메모리 할당
	printf("%d byte \n", sizeof(num)); // 4byte
}

 

그런데 위에서 설명한 내용은 반만 맞고 반은 틀리다.

왜냐하면 컴파일러가 컴파일 과정에서 enum의 크기를 결정하기 때문이다.

예를 들어 ZERO에 4byte이상의 값을 넣으면 8btye 크기로 증가되는 모습을 볼 수 있다.

따라서 enum의 크기는 최소 4byte이며 지정된 값에 따라 크기는 변동된다고 이해하면 될 듯한다.

#include <stdio.h>

enum e		//enum 정의, 메모리 할당 안됨
{
	ZERO = 0x100000000000L,
	ONE, 
	TWO, 
	THREE 
};

int main()
{
	enum e num; //enum 변수 선언, 메모리 할당
	num = ZERO;
	printf("%d byte \n", sizeof(num)); // 8byte
}

결과

8 byte

 

출처 : https://www.morenice.kr/113

 

- enum을 사용하는 이유

상수는 변하지 않는 수다. PI 처럼 말이다. (3.141952)

따라서 한번 선언하면 수정 할 일이 없다.

하지만 많은 상수들을 사용하게 될때 숫자로 되어있으면 의도를 파악하기 어렵다.

이때 enum을 사용해 상수들을 묶어 별명을 지어주면 코드의 의도를 파악하기 쉬워진다.

 

 

 

반응형