코드를 보다보면 세가지가 잘 쓰이는데 정확한 차이가 무엇인가 확실히 짚기 위해 쓴다
✅ 결론 : 컴파일 타임에 타입까지 확인하는 constexpr를 쓰는 것을 권장한다.
`#define`
- 전처리기 지시어: 컴파일 전에 코드에서 사용됩니다.
- 매크로 정의: 단순한 텍스트 치환으로, 타입이 없고, 컴파일 타임 검사가 없습니다.
#define PI 3.14
`const`
- 변수 선언: 변수를 상수로 선언하여 값을 변경할 수 없다.
- 타입 지정: 타입이 있으며, 컴파일 타임과 런타임에서 사용될 수 있다.
const double pi = 3.14;
`constexpr`
- 컴파일 타임 상수: 컴파일 타임에 값을 계산할 수 있는 상수를 정의한다.
- 타입 지정: const와 비슷하지만, 반드시 컴파일 타임에 평가될 수 있는 표현식으로 초기화해야 한다.
constexpr double pi = 3.14;
컴파일 타임에 상수 취급되므로 당연히 속도에서 더 이득이므로 최적화하기 좋다.
const와 constexpr의 차이를 모르겠다면..
rand 라는 변수에 `std::rand()`를 이용해 랜덤값을 넣어보자.
const의 경우는 아무런 문제 없이 잘된다. 런타임에 rand()가 대입된 후 바뀌지 않는 변수일 뿐인다.
const rand = std::rand();
반면, constexpr는 컴파일 타임에 값이 정해져야하기 때문에 런타임에 값이 나오는 `std::rand`를 사용할 수 없다.
//constexpr rand = std::rand();