C++ const, constexpr
1. 개요
1.1 문서 개요
이 문서는 C++에서 상수 표현을 위한 키워드 const
와 constexpr
에 대해 설명합니다. 이 두 키워드는 프로그램 내 값의 불변성을 보장하며, 컴파일 타임 상수와 관련된 최적화, 오류 방지 및 표현력 향상에 중요한 역할을 합니다. 특히 C++11 이후 constexpr
의 도입은 컴파일 타임 계산 기능을 확장하여 정적 프로그래밍을 가능하게 합니다.
2. 내용
2.1 const 키워드
2.1.1 개념 및 사용 목적
const
는 변수 또는 객체가 초기화된 이후 변경될 수 없음을 의미합니다. 포인터, 함수 매개변수, 클래스 멤버 함수 등 다양한 문맥에서 사용됩니다.
const int a = 10; // 상수 변수
2.1.2 const 포인터 구문
int x = 5, y = 10;
const int* p1 = &x; // 포인터가 가리키는 값은 변경 불가
int* const p2 = &x; // 포인터 자체는 변경 불가
const int* const p3 = &x; // 둘 다 변경 불가
2.1.3 const 함수 인자와 반환값
void func(const std::string& s); // 인자 변경 불가
const std::string& get(); // 반환된 문자열 변경 불가
2.1.4 const 멤버 함수
멤버 함수에 const
를 붙이면 해당 함수는 객체의 멤버를 변경하지 않음을 보장합니다.
class A {
public:
int get() const; // 멤버 변수 수정 불가
};
2.2 constexpr 키워드
2.2.1 개념 및 배경
constexpr
은 컴파일 타임에 평가될 수 있는 상수 표현을 정의하는 키워드로, C++11에서 도입되었습니다. 이후 C++14부터는 제약이 완화되어 더 복잡한 표현도 가능해졌습니다.
constexpr int square(int x) {
return x * x;
}
constexpr int val = square(5); // 컴파일 타임 평가
2.2.2 constexpr 변수
컴파일 타임 상수를 선언할 수 있습니다.
constexpr int SIZE = 100;
2.2.3 constexpr 함수 조건
- 반환값이 constexpr 가능해야 함
- 인자 및 연산이 모두 컴파일 타임 가능해야 함 (C++14 이전)
- 함수는 단일 return 문으로 표현 가능해야 함 (C++11 기준)
2.2.4 C++14 이후 변화
C++14부터는 constexpr
함수 내부에 if, for, 변수 선언 등 다양한 표현이 허용됩니다.
constexpr int factorial(int n) {
int result = 1;
for (int i = 2; i <= n; ++i)
result *= i;
return result;
}
2.3 const vs constexpr 비교
항목 | const | constexpr |
---|---|---|
평가 시점 | 런타임 또는 컴파일 타임 | 반드시 컴파일 타임 |
불변성 | 값의 변경 불가 | 컴파일 타임 상수 |
함수 적용 | 불가능 | 가능 |
복잡한 표현 허용 | 불가 | C++14부터 가능 |
3. 마무리
const
는 불변성을 의미하며 다양한 문맥에서 사용되어 코드 안정성과 의도를 명확히 합니다. 반면 constexpr
은 컴파일 타임 상수를 정의하며, 프로그램의 정적 분석 및 최적화에 기여합니다. 두 키워드는 각기 다른 목적과 의미를 가지며, 적절히 구분하여 사용하는 것이 중요합니다.