C++에서 상수를 정의할 때 크게 두가지 방법이 있다.
#define
과 const
인데, 둘의 차이를 한번 정리해보려고 한다.
#define
vs const
선언 방법
#define VAR_NAME 10
const int VAR_NAME = 10;
컴파일 과정
컴파일 과정을 간략하게 요약하면
pre-processor
-> Compiler
-> Assembler
-> Linker
를 거치게 되는데, #define
은 전처리어로 전처리 단계에서 처리되고, const
는 컴파일러가 처리한다.
처리 방식
#define은 매크로 형식이다. 즉, 전처리기가 단순히 코드 상에 있는 모든 #define으로 정의된 것을 찾아서 실제 값으로 치환한다는 뜻이다. 반면 const는 리터럴이라고도 불린다. 변수처럼 취급되지만, 처음 정의된 이후로는 값이 바뀌지 않는 것이 보장된다.
장단점
const의 경우, 타입을 지정할 수 있기 때문에 컴파일 과정에서 타입체크가 일어난다. 또한 디버거에도 변수 이름이 나오기 때문에 디버깅을 하기 쉽다.
반면 #define의 경우, 메모리 영역에 올라가지 않아 메모리를 절약할 수 있다. 또한 파라미터를 받아 간단한 함수를 만들 수도 있다.
정리
사실 #define
의 경우, 대부분의 프로그램에서는 권장하지 않는다. 요즘은 메모리가 아쉬운 세대가 아니기 때문에 코드 유지&보수 측면에서 const
를 쓰는 것이 좋다. 그러나, 임베디드와 같이 작은 메모리를 가지고 동작시켜야 하는 경우에는 당연히 #define
이 좋다. 예를 들어 아두이노 우노 보드의 경우 2kb의 SRAM을 가지고 있는데, 이럴 경우에는 메모리 절약에 신경을 써줘야 하므로 #define
을 쓰는 것이 좋겠다.
한줄 정리: 임베디드가 아니면 const
를 쓰자.