본문 바로가기
C++/기초

C++ 기초 : enum

글: 시플마 2024. 4. 29.

BST의 insert 함수를 구현한 아래 코드에서

 

61 ~ 75번째 줄에 있는 if 문과 

76 ~ 90번째 줄에 있는 else if 문이 

대칭으로 구성되어 있는 것이 느껴지시나요?

 

두 구문 모두 같은 동작이지만

if 문은 왼쪽 자식 노드에 대한 동작이고 

elese if 문은 오른쪽 자식 노드에 대한 동작입니다.

 

 

이런 코드는 'enum'이라는 것을 통해 코드를 줄여줄 수 있습니다. 

 

아래 코드를 보시면

 

57번째 줄에 있는 것이 바로 enum입니다.

열거형이라고도 부르죠.

 

중괄호 안에 단어를 적어 주면 됩니다.

간단하죠.

 

이제 해당 단어를 사용하게 되면

특정 값으로 인지하게 됩니다.

 

아무런 대입을 하지 않을 시, 가장 처음 적은

키워드를 0으로 보고 다음에 추가되는 키워드는 

값을 하나 높여 인지하게 되죠.

 

 

실제 main 함수에서 변수 a를 선언하고

TYPE_1을 대입하니 a에 0이 대입되는 것을

확인할 수 있습니다.

 

 

적어 놓은 키워드에 값을

대입하는 것도 가능합니다.

 

62번째 줄에 TYPE_4라는 키워드를 적고 100을 대입했습니다.

 

그럼 TYPE_4은 100이라는 값을 의미하게 되겠죠.

 

그럼 바로 다음 줄에 적은 TYPE_5는 몇을 의미할까요?

100을 대입한 키워드의 다음 키워드이므로 1을 더한

101을 의미하게 됩니다.

 

 

변수 a에 TYPE_5를 대입하여 확인해 보니 

101이 대입된 것을 확인할 수 있습니다.

 

 


 

 

 

근데 다른 사람과 작업하다 보면

 

분명 키워드가 중복되는 순간이 있을 겁니다.

 

위 코드 같은 경우에는 새로 만든 enum 안에 

기존에 존재했던 키워드 TYPE_1을 또 사용했네요.

 

이럴 경우 TYPE_1을 사용하게 되면

어디에 있는 TYPE_1을 의미하는지 모호해져

오류가 발생합니다. 정말 실행해 보니 오류가 발생하네요.

 

 

이러한 중복 문제를 방지하고자

 

나온 것이 'enum class' 입니다.

 

 

enum 뒤에 class를 붙여 주면 되는데요,

enum class에 들어 있는 키워드를 사용하려면 

반드시 사용하려는 키워드가 어디 enum class에

있는 것인지 명시해 줘야 하며, 해당 키워드를

어떤 타입으로 볼 것인지까지 명시해 줘야 합니다. 

 

위 코드에서 사용하려는 TYPE_1은 

MY_TYPE이라는 enum class에 있는 키워드이며

정수 자료형으로 볼 것임을 명시해 주었네요.

 

 

75번째 줄은 소속된 enum class를

명시해 줘야 하기 때문에 같은 이름의 키워드인

TYPE_1을 사용할 수 있는 모습입니다.

 

 

확실히 그냥 enum을 사용할 때보다 

명시해 줘야 할 것이 많아 불편한 느낌이 있지만

중복으로 인해 모호해진다는 문제를 방지해 준다는

점에서 더 발전한 기능이라고 볼 수 있습니다.

 

어떤 것을 실행하는 기능도 중요하지만

프로그래머가 하면 안되는 행동을 미리 

차단시켜 주는 것도 좋은 기능이니까요.

 

 

 


 

 

 

열거형이 하는 역할은 사실

 

#define 전처리기 지시문을 통해 

똑같이 표현할 수 있습니다.

 

그렇다면 enum과

define 지시문의 차이점은 무엇일까요?

 

74번째 줄에서 enum class에 있는

TYPE_1 키워드를 통해 변수 a에 값을 

넣었습니다. 이러면 심볼 테이블에 MY_TYPE라는

이름 정보가 남습니다. 그래서 컴파일러가 단순히 a에

0이라는 값을 넣었다고 생각하지 않고 MY_TYPE이라는

enum class 안에 있는 TYPE_1에 대응하는 값인 0을 넣었다는

것을 인지하게 됩니다. 그러면 나중에 중단점을 찍고

디버깅을 하였을 때 변수 a에 어떤 어떤 enum class 안에 있는

TYPE_1을 넣었다라는 것이 시각적으로 보입니다.

 

 

그러나 75번째 줄처럼 define 지시문에서 

선언된 키워드를 통해 값을 대입하면

define 지시문은 컴파일 이전에 실행되는 전처리기이기 때문에 

컴파일러 입장에서는 이미 전처리가 진행된 모습인

 int b = 0; 라는 코드로 보입니다.

 

이러면 나중에 디버깅할 때 b에 0이 들어왔다는 정보밖에

볼 수 없습니다. 그래서 define 지시문이 선언된 쪽으로 가서

 0이라는 값이  무슨 키워드인지 확인해야 비로소

TYPE_1이라는 키워드를 대입해서

변수 b에 0이 대입되었음을 깨닫는 겁니다.

 

 

예를 들어 W를 눌렀을 때, 캐릭터가 앞으로 가도록

코드를 작성했습니다. 그런데 W를 눌러도 앞으로 가지 않습니다.

 

그래서 코드를 확인했더니 R을 입력받았을 때 앞으로 가도록

되어 있네요. 잘못 작성한 거죠. 직관적으로 무엇이 문제인지 보입니다.

 

앞으로 가는 동작을 수행하는 코드 부분을 봅니다. 그런데 보니까

554를 입력받았을 때 앞으로 가도록 되어 있네요.

근데 해당 숫자가 무엇을 의미하는지 다 외우고 있을 수는 없기 때문에

define 지시문이 선언된 부분으로 가서 확인합니다.

보니까 554는 R이고, W는 234로 지정했었네요.

이제서야 234를 입력받았을 때 앞으로 가도록 수정해야겠다고 깨닫습니다.

 

 

디버거가 타입 정보를 인식하고 있다는 것이

얼마나 편리한 것인지 느껴지네요.

 

 


 

 

강의 출처 : https://www.youtube.com/watch?v=mWk4-YyeZfA&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&index=76

 


'C++ > 기초' 카테고리의 다른 글

C++ 기초 : tree (8)  (0) 2024.05.01
C++ 기초 : tree (7)  (0) 2024.04.30
C++ 기초 : tree (6)  (0) 2024.04.27
C++ 기초 : tree (5)  (0) 2024.04.27
C++ 기초 : tree (4)  (0) 2024.04.26