C++에서 #define과 const의 핵심 차이점
C++에서 상수를 정의할 때 #define과 const 두 가지 방식을 모두 사용할 수 있지만, 이 둘은 내부적으로 완전히 다르게 동작합니다.
#define: 전처리기 지시문
#define은 전처리기(preprocessor) 지시문입니다. 컴파일러가 코드를 보기도 전에 전처리기가 해당 매크로를 본문(body)으로 단순히 치환합니다. 즉, 소스 코드 전체에 대해 자동으로 '찾아 바꾸기'를 수행하는 것과 같습니다.
이 때문에 #define에는 타입 정보가 없고, 디버깅 시 실제 식별자로 확인되지 않으며, 어떤 스코프(scope)에도 속하지 않고 파일 전체에 영향을 미칩니다.
const: 실제 변수 선언
반면 const 변수 선언은 언어 차원에서 실제 변수를 만드는 것입니다. 따라서 일반 변수처럼 다양하게 활용할 수 있습니다.
- 주소를 참조(& 연산자)할 수 있습니다
- 함수 인자로 전달할 수 있습니다
- 타입 캐스팅 및 형 변환이 가능합니다
또한 const는 타입 검사(type checking)의 이점을 누리고, 선언된 스코프 내에서만 유효하기 때문에 네임스페이스나 클래스 내부에 안전하게 정의할 수 있습니다.
메모리 할당과 최적화
컴파일러 최적화가 없는 경우, 두 방식 모두 상황에 따라 메모리 할당과 관련된 숨겨진 비용이 발생할 수 있습니다. 하지만 적절한 컴파일러 최적화가 적용되면 성능 면에서 사실상 차이가 없어집니다.
정리하면, 전처리기 매크로는 스코프가 없지만 const 값은 스코프를 가지며, 현대 C++에서는 타입 안정성과 디버깅 편의성 때문에 #define보다 const(또는 constexpr)를 사용하는 것이 권장됩니다.