const, constexpr: 바뀌지 않는 값과 컴파일 시간 계산
7강. const, constexpr: 바뀌지 않는 값과 컴파일 시간 계산
이번 강의에서 해결할 문제
변하지 않아야 할 최대 슬롯 수가 프로그램 곳곳에서 수정 가능하면 실수로 규칙이 바뀔 수 있습니다. 반대로 실행 중 입력으로 정해지는 값을 억지로 컴파일 시간 상수로 만들 수는 없습니다.
학습 목표
const와constexpr의 공통점과 차이를 설명합니다.- 컴파일 시간에 계산 가능한 함수를 작성합니다.
- 변경하지 않는 함수 인자와 지역 값에
const를 적용합니다.
먼저 알아야 할 핵심 개념
const는 객체를 해당 이름을 통해 수정하지 않겠다는 약속입니다. 초기값은 실행 중 결정될 수도 있습니다. constexpr는 값이나 함수가 상수 표현식으로 계산될 수 있음을 나타내며 컴파일 시간 문맥에서 사용할 수 있습니다. 모든 constexpr 값은 수정할 수 없지만 모든 const 값이 컴파일 시간 상수인 것은 아닙니다.
가장 작은 실행 가능한 예제
#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';
}
핵심 코드 줄별 설명
slotCount는 전달된 값만으로 결과를 계산합니다.maxSlots는 컴파일 시간에 20으로 계산될 수 있습니다.- 예제의
occupiedSlots는 읽기 전용 런타임 값으로 생각할 수 있습니다. freeSlots도 계산 뒤 바뀌지 않아const로 선언합니다.- 변경 금지 의도가 선언부에 있어 이후 코드를 추적하기 쉽습니다.
실행 결과와 값 변화
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개
const값이 항상 컴파일 시간 상수가 아닌 이유는 무엇인가요?constexpr함수에 적합한 계산은 어떤 특징을 갖나요?- 변경하지 않는 지역 변수에
const를 붙이면 어떤 검토 비용이 줄어드나요?
핵심 요약
const는 수정하지 않는다는 약속이고 constexpr는 컴파일 시간 계산 가능성을 표현합니다. 값이 언제 정해지고 이후 바뀌어야 하는지 먼저 판단한 뒤 선택합니다.
다음 강의 연결
8강. 범위 기반 for에서 컨테이너 원소를 읽을지 수정할지 const와 참조로 표현합니다.
const, constexpr: 바뀌지 않는 값과 컴파일 시간 계산 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.