본문으로 건너뛰기
모던 C++ 심화LESSON 21

constexpr, enum class, 범위 기반 for: 안전하고 명확한 Modern C++ 문법

난이도중급 → 심화
예상 시간70분
선수지식이전 강의

21강. constexpr, enum class, 범위 기반 for: 안전하고 명확한 Modern C++ 문법

이번 강의에서 해결할 문제​

마법 숫자 0·1·2로 상태를 표현하고 인덱스 반복을 직접 작성하면 다른 의미의 정수와 섞이거나 범위를 벗어나기 쉽습니다. Modern C++ 문법은 짧게 쓰기 위한 장식이 아니라 잘못된 표현을 컴파일 단계에서 줄이는 도구입니다.

학습 목표​

먼저 알아야 할 핵심 개념​

constexpr 변수·함수는 주어진 조건에서 컴파일 시간 평가가 가능함을 나타냅니다. enum class 열거자는 해당 타입 범위 안에 있어 다른 정수나 enum과 암시적으로 섞이지 않습니다. 범위 기반 for는 컨테이너의 시작·끝 반복을 표현하고 원소 복사 여부는 반복 변수 타입이 결정합니다.

왜 이 문제가 위험한가​

일반 enum이나 정수 상태는 서로 다른 도메인의 1을 잘못 비교해도 컴파일될 수 있습니다. 범위 for에서 auto task를 사용하면 큰 작업을 매번 복사하며 수정도 원본에 반영되지 않습니다. 반대로 auto&로 읽기만 하는 코드가 원본을 수정할 가능성을 열어 둡니다.

가장 작은 예제로 시작하기​

modern_syntax.cpp
#include <iostream>
#include <string>
#include <vector>

enum class TaskStatus { Pending, Running, Completed };

constexpr int priorityLimit() noexcept { return 5; }

struct Task {
std::string name;
int priority{};
TaskStatus status{TaskStatus::Pending};
};

int main() {
static_assert(priorityLimit() == 5);
const std::vector<Task> tasks{{"build", 3}, {"test", 2}};
for (const Task& task : tasks) {
std::cout << task.name << ':' << task.priority << '\n';
}
}

코드 한 줄씩 이해하기​

  1. TaskStatus 값은 반드시 타입 이름 범위로 사용합니다.
  2. priorityLimit는 컴파일 시간에도 평가할 수 있는 단순 규칙입니다.
  3. static_assert는 조건이 거짓이면 빌드를 막습니다.
  4. 읽기 전용 vector 원소는 const Task&로 순회해 복사를 피하고 수정을 막습니다.
  5. 상태의 기본값을 명시해 초기화되지 않은 정수를 피합니다.

실행 결과와 메모리·동작 흐름​

build:3, test:2가 출력됩니다. 반복 변수는 각 원소의 읽기 전용 별칭이라 새 Task를 만들지 않습니다. priorityLimit은 컴파일 시간 상수로도 사용할 수 있지만 모든 const 값이 자동으로 constexpr인 것은 아닙니다.

단계별 실습​

흔한 실수와 해결 방법​

언제 사용하고 언제 피할까​

고정된 상태 집합은 enum class, 컴파일 시간에 검증 가능한 순수 규칙은 constexpr, 전체 범위 순회는 범위 for를 사용합니다. 인덱스 자체가 필요하거나 두 범위를 동기화해야 하면 더 적절한 반복 구조를 선택합니다.

게임 개발 연결​

상태·팀·아이템 등급처럼 닫힌 집합과 고정 상수에 같은 원칙을 적용할 수 있습니다. 엔진 Reflection이 필요한 열거형은 별도 매크로 규칙이 있지만 표준 타입 안전성의 목적은 유지합니다.

이해 점검 질문 3개​

  1. enum class가 일반 정수 상태보다 잘못된 비교를 줄이는 이유는 무엇인가요?
  2. 범위 for에서 const auto&와 auto의 복사 차이는 무엇인가요?
  3. const 함수와 constexpr 함수는 어떤 점이 다른가요?

핵심 요약​

다음 강의 연결​

22강. 멀티스레드 입문에서 한 줄짜리 증가도 여러 스레드가 공유하면 안전하지 않은 이유를 확인합니다.

MINI QUIZ

constexpr, enum class, 범위 기반 for: 안전하고 명확한 Modern C++ 문법 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“constexpr, enum class, 범위 기반 for: 안전하고 명확한 Modern C++ 문법”에서 오류나 데이터 손실을 줄이는 선택은 무엇인가요?
  2. 문제 2“constexpr, enum class, 범위 기반 for: 안전하고 명확한 Modern C++ 문법”에서 ‘범위 for에서 무심코 값 복사’ 문제가 생겼습니다. 가장 알맞은 진단 또는 대응은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

21강. constexpr, enum class, 범위 기반 for: 안전하고 명확한 Modern C++ 문법 미완료 상태