전체 코드
#include <iostream>
using namespace std;
const int SCISSORS = 1;
const int ROCK = 2;
const int PAPER = 3;
enum ENUM_SRP
{
ENUM_SCISSORS = 1,
ENUM_ROCK,
ENUM_PAPER
};
int main()
{
int choice = ENUM_ROCK;
cout << "선택한 값 : " << choice << endl;
return 0;
}
🔥 한 줄씩 상세 분석
| 코드 | 설명 |
|---|
#include <iostream> | 표준 입출력 라이브러리 포함 (cout 사용 목적) |
using namespace std; | 매번 std:: 안 쓰게 도와주는 선언 |
const int SCISSORS = 1; | 가위라는 의미를 가진 상수 선언 |
const int ROCK = 2; | 바위라는 의미를 가진 상수 선언 |
const int PAPER = 3; | 보라는 의미를 가진 상수 선언 |
enum ENUM_SRP { ... } | 서로 관련된 상수들을 묶은 열거형 정의 |
ENUM_SCISSORS = 1 | 첫 번째 값 1로 지정 |
ENUM_ROCK | 자동으로 2가 됨 |
ENUM_PAPER | 자동으로 3이 됨 |
int choice = ENUM_ROCK; | 열거형 값으로 변수 초기화 |
cout << choice | 선택한 값 출력 (2 출력) |
📌 열거형의 핵심 포인트 정리
| 구분 | 설명 |
|---|
| 열거형 정의 | 서로 관련된 상수를 하나의 그룹으로 관리 |
| 자동 값 할당 | 첫 값만 지정하면, 이후 값은 자동으로 +1 |
| 메모리 절약 | 컴파일 시 실제 값으로 치환되어 메모리 절약 |
| 디버깅 용이성 | 디버그 시 의미 있는 이름으로 확인 가능 |
| 관리 편의성 | 그룹화되어 가독성 및 유지보수 쉬움 |
💡 왜 열거형을 써야 할까?
| 방법 | 특징 | 문제점 |
|---|
| const 상수 | 상수 이름과 값 연결 | 개수가 많아지면 관리 어려움 |
| #define | 값 치환 (매크로) | 디버깅 어려움, 타입 체크 안됨 |
| 열거형 | 그룹화 + 자동 증가 | 없음 (가장 추천) |
🚨 주의할 점
| 상황 | 설명 |
|---|
| const는 메모리 낭비 가능 | 상수지만 경우에 따라 메모리 차지 |
| #define은 디버그 불편 | 전처리 단계 치환 → 디버그 시 추적 어려움 |
| enum은 타입 안전성 없음 | enum끼리 타입 체크는 안 됨 (C++11 이후 개선 가능) |
| 값 강제 변경 시 주의 | 중간 값 건너뛰기 가능 (주의) |
💬 const vs enum vs define 비교 표
| 항목 | const | #define | enum |
|---|
| 메모리 차지 | 컴파일러 최적화 여부에 따라 다름 | 안 차지 (치환) | 안 차지 (치환) |
| 디버그 편의성 | 보통 괜찮음 | 값 추적 어려움 | 디버그 친화적 |
| 타입 안전성 | 있음 | 없음 | 없음 (C++11 이후 개선) |
| 가독성 | 좋음 | 나쁨 | 매우 좋음 |
| 그룹화 | 불편 | 불가능 | 편리 |
| 추천도 | 중간 | 비추 | 강력 추천 |
⚠️ 메모리 관점 정리
| 선언 위치 | 메모리 영역 | 설명 |
|---|
| 전역 const | 보통은 치환되지만, 주소 참조 시 .data | 컴파일러 최적화 영향 받음 |
| 지역 const | 스택에 할당될 수도 있음 | 주소 참조 여부 따라 달라짐 |
| #define | 메모리 할당 없음 | 소스코드 치환 |
| enum | 메모리 할당 없음 | 컴파일 시 치환 |
📊 실전 예제 비교 (가위바위보)
const 방식
const int SCISSORS = 1;
const int ROCK = 2;
const int PAPER = 3;
define 방식
#define SCISSORS 1
#define ROCK 2
#define PAPER 3
enum 방식
enum ENUM_SRP { ENUM_SCISSORS = 1, ENUM_ROCK, ENUM_PAPER };
추천 순서
1위 - enum (가독성, 유지보수, 디버깅 모두 최상)
2위 - const (디버그는 괜찮지만 그룹화 어려움)
3위 - #define (디버깅 불편, 에러 유발 가능성 높음)
📖 실습 문제 추천
| 난이도 | 문제 |
|---|
| ⭐ | 가위바위보 열거형으로 다시 만들기 |
| ⭐⭐ | 캐릭터 상태(이동/점프/공격) 열거형으로 관리 |
| ⭐⭐⭐ | 몬스터 타입(슬라임/오크/드래곤) 열거형으로 관리 |
| ⭐⭐⭐⭐ | 아이템 종류와 희귀도(enum class)로 관리 |
✨ enum class (C++11 이후)
| 특징 | 설명 |
|---|
| 타입 안전성 | 다른 enum과 혼동 불가 |
| 스코프 제공 | enum 이름이 스코프 역할 |
| 강력한 타입 체크 | 암시적 형변환 방지 |
enum class MonsterType { Slime, Orc, Dragon };
MonsterType monster = MonsterType::Slime;
🛠️ 정리 요점
| 키워드 | 핵심 내용 |
|---|
| 열거형 | 관련된 상수 묶기 |
| enum | 타입 없이 나열 가능 |
| enum class | 타입 안전성 강화 |
| const vs define vs enum | enum 최강 |
| 메모리 | enum은 메모리 차지 없음 |
📥 필요 자료 제공 가능
✅ 정리 PDF
✅ 연습문제 (빈칸 채우기, 실습문제)
✅ 디버깅 실습 예제 (주소 참조 상황 확인)
✅ enum class 심화 학습 자료
🙋♂️ 다음 학습 추천
| 다음 추천 주제 | 이유 |
|---|
| 함수 | 함수 구조 & 호출 과정 마스터 |
| 배열 | 반복문과 배열 연계 학습 |
| 포인터 | 메모리 직접 제어 감각 익히기 |
| 구조체 | 데이터 묶음 관리 학습 |
필요한 자료나 다음 학습 주제 알려주시면 바로 준비해드릴게요!
열거형 완벽 마스터 축하드립니다 🎉
다음은 어떤 주제로 갈까요? 😎