본문으로 건너뛰기
모던 C++LESSON 07

const, constexpr: 바뀌지 않는 값과 컴파일 시간 계산

난이도초급 → 중급 입문
예상 시간45분
선수지식이전 강의

7강. const, constexpr: 바뀌지 않는 값과 컴파일 시간 계산

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

변하지 않아야 할 최대 슬롯 수가 프로그램 곳곳에서 수정 가능하면 실수로 규칙이 바뀔 수 있습니다. 반대로 실행 중 입력으로 정해지는 값을 억지로 컴파일 시간 상수로 만들 수는 없습니다.

학습 목표​

  • const와 constexpr의 공통점과 차이를 설명합니다.
  • 컴파일 시간에 계산 가능한 함수를 작성합니다.
  • 변경하지 않는 함수 인자와 지역 값에 const를 적용합니다.

먼저 알아야 할 핵심 개념​

const는 객체를 해당 이름을 통해 수정하지 않겠다는 약속입니다. 초기값은 실행 중 결정될 수도 있습니다. constexpr는 값이나 함수가 상수 표현식으로 계산될 수 있음을 나타내며 컴파일 시간 문맥에서 사용할 수 있습니다. 모든 constexpr 값은 수정할 수 없지만 모든 const 값이 컴파일 시간 상수인 것은 아닙니다.

가장 작은 실행 가능한 예제​

inventory_limits.cpp
#include <iostream>

constexpr int slotCount(const int rows, const int columns) {
return rows * columns;
}

int main() {
constexpr int maxSlots{slotCount(4, 5)};
const int occupiedSlots{7};
const int freeSlots{maxSlots - occupiedSlots};

std::cout << maxSlots << ' ' << freeSlots << '\n';
}

핵심 코드 줄별 설명​

  1. slotCount는 전달된 값만으로 결과를 계산합니다.
  2. maxSlots는 컴파일 시간에 20으로 계산될 수 있습니다.
  3. 예제의 occupiedSlots는 읽기 전용 런타임 값으로 생각할 수 있습니다.
  4. freeSlots도 계산 뒤 바뀌지 않아 const로 선언합니다.
  5. 변경 금지 의도가 선언부에 있어 이후 코드를 추적하기 쉽습니다.

실행 결과와 값 변화​

20 13

행을 3으로 바꾸면 최대 슬롯은 15, 빈 슬롯은 8이 됩니다. 최대 크기는 빌드 전에 계산되고 점유 슬롯은 실행 시점 데이터와 결합됩니다.

단계별 실습​

실습 목표​

격자 맵의 최대 셀 수와 남은 셀 수를 계산합니다.

시작 전 상태와 실행 방법​

예제의 함수를 복사한 C++17 콘솔 프로젝트를 준비합니다.

1단계: 최소 코드 작성​

가로 8, 세로 6인 맵의 셀 수를 constexpr로 계산합니다.

2단계: 값 또는 조건을 바꿔 결과 비교​

사용 중인 셀 수를 10과 40으로 바꾸어 남은 값을 비교합니다.

3단계: 작은 기능 확장​

셀 하나의 메모리 크기를 곱해 전체 예상 바이트를 계산하는 constexpr 함수를 추가합니다.

4단계: 스스로 해결하기​

배열 크기에 계산 결과를 사용해 컴파일 시간 상수임을 확인하세요.

막혔을 때​

constexpr 함수 안에서 파일 읽기나 일반 출력처럼 컴파일 시간에 수행할 수 없는 작업을 호출하면 상수 계산에 사용할 수 없습니다. 계산과 런타임 입출력을 분리합니다.

흔한 실수와 해결 방법​

  • 모든 값에 constexpr 적용: 사용자 입력이나 파일 결과는 실행 중에만 알 수 있습니다.
  • const를 성능 기능으로만 생각: 가장 큰 이점은 변경 계약과 컴파일 검증입니다.
  • 멤버 함수 const 누락: 객체 상태를 바꾸지 않는 조회 함수는 심화 과정에서 const 멤버 함수로 확장합니다.

게임 개발 연결​

고정 인벤토리 크기, 방향 수, 테이블 범위는 constexpr 후보입니다. 현재 체력이나 접속자 수는 런타임 데이터이므로 계산 후 변경하지 않는 지역 값에 const를 적용하는 방식이 맞습니다.

이해 점검 질문 3개​

  1. const 값이 항상 컴파일 시간 상수가 아닌 이유는 무엇인가요?
  2. constexpr 함수에 적합한 계산은 어떤 특징을 갖나요?
  3. 변경하지 않는 지역 변수에 const를 붙이면 어떤 검토 비용이 줄어드나요?

핵심 요약​

const는 수정하지 않는다는 약속이고 constexpr는 컴파일 시간 계산 가능성을 표현합니다. 값이 언제 정해지고 이후 바뀌어야 하는지 먼저 판단한 뒤 선택합니다.

다음 강의 연결​

8강. 범위 기반 for에서 컨테이너 원소를 읽을지 수정할지 const와 참조로 표현합니다.

MINI QUIZ

const, constexpr: 바뀌지 않는 값과 컴파일 시간 계산 미니 퀴즈

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

0 / 2
  1. 문제 1“const, constexpr: 바뀌지 않는 값과 컴파일 시간 계산”의 코드·명령이 의도대로 동작하는지 판단할 기준은 무엇인가요?
  2. 문제 2‘const를 성능 기능으로만 생각’ 실수를 판단할 때 “const, constexpr: 바뀌지 않는 값과 컴파일 시간 계산” 강의가 제시한 기준은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

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

7강. const, constexpr: 바뀌지 않는 값과 컴파일 시간 계산 미완료 상태