1 minute read

enum과 변수 선언의 차이

메모리를 잡아먹는 변수 선언

가위바위보 게임을 만든다고 가정하자. 가위를 1, 바위를 2, 보를 3, 이런 식으로 변수를 정해서 게임을 만들 수 있다. 예를 들면, 아래와 같이 만들 수 있다.

// 다른 부분은 생략
const int SCISSORS = 1;
const int ROCK = 2;
const int PAPER = 3; 

int main ()
{
    //////// 생략 /////// 
}

main 함수 안에 변수를 만들게 되면 당연히 스택 프레임에 올라가게 된다. 또는 위의 코드와 같이 전역변수로 선언하게 되면, 컴파일러에 따라 다른데, 디버깅을 해보면, 주소가 할당되어있는 경우가 있고 그렇지 않은 경우가 있다.

어쨌든 저렇게 변수를 선언해두면 메모리를 잡아먹을 수 있다는 것이 포인트이다.

위의 예제가 가위바위보가 아니라 대규모 게임이고, 몬스터가 무적 상태인지, 스턴 상태인지 등등 이런 것들이 무수히 쌓일 것인데, 그때도 저렇게 변수를 선언해서 관리하게 되면 엄청난 메모리를 잡아먹게 될 것이다. 모든 변수를 다 사용하지는 않기 때문이다. 그래서 enum이 필요하다.

가독성을 높이는 enum

enum RSP
{
    ENUM_SCISSORS = 1,
    ENUM_ROCK,
    ENUM_PAPER
}

enum을 따로 초기화하지 않으면 위의 값이 차례로 0, 1, 2가 되고, 위처럼 ENUM_SCISSORS를 1로 적어두면 차례로 1, 2, 3이 된다.

가위바위보 게임에서 input 값과 enum안의 값들을 비교해본다고 하면,

cin >> input;
if (input == ENUM_SCISSORS)  /// ~~~~

이런 식의 코드를 만들 수 있을텐데, 마치 우리가 변수를 선언한 것과 같이 보일 수 있지만, 디버깅하여 어셈블리 코드를 까보면 ENUM_SCISSORS라는 공간이 따로 만들어진 것이 아니고 1이 곧바로 R Value로 들어간 것을 확인해볼 수 있다. 이것이 변수를 선언해서 사용하는 것의 차이이다. enum은 메모리도 절약할 수 있게 해주고, 코드의 가독성 또한 높여준다.

Tags:

Categories:

Updated: