2017년 11월 20일 월요일

What is the differences between #define and const keyword

#define 키워드와 const 키워드의 차이

(출처) http://www.careerride.com/c-define-and-constant.aspx

#define은 상수나 매크로에 사용되는 반면, const키워드는 값이 변경되지 않도록 변수앞에 사용됩니다.

포인터는 const 키워드로 선언될 순 있지만 #define으로는 선언될 수 없습니다.

(출처) http://soen.kr/

const 예약어의 용도는 매크로 상수를 정의하는 #define 전처리문과 유사하다. 상수에 좀 더 분명한 의미의 이름을 부여한다는 것과 자주 사용되는 상수를 한 곳에서만 정의함으로써 일괄적인 수정을 쉽게 한다는 점에서 기능상 동일하다고 할 수 있으며 사실 상호 대체 가능하다. 그러나 const는 #define에 비해 다음과 같은 장점을 가지고 있다.

① #define이 정의하는 매크로 상수는 타입을 지정할 수 없지만 const는 상수의 타입을 명확하게 지정할 수 있다. 위 예에서 Day는 실수 24.0이나 문자열 "24"가 아닌 정수형의 24라는 것을 분명하게 지정한다. C++은 타입을 중요시하기 때문에 상수의 정확한 타입이 의미를 가지는 경우가 있다.
② 매크로 상수는 일단 정의된 후에는 언제든지 어느 곳에서나 사용할 수 있지만 const는 통용 범위 규칙의 적용을 받기 때문에 자신이 선언된 범위 내에서만 사용할 수 있다. 함수 내부에서 선언한 상수는 함수 내부에서만 사용할 수 있으며 함수 밖으로는 알려지지 않는다. 즉, 지역 상수를 만들 수 있으며 명칭간의 충돌을 최소화할 수 있다.
#define은 컴파일러가 아닌 전처리기에 의해 치환되기 때문에 실제 소스에는 매크로가 치환된 상태로 실행된다. 그래서 디버깅 중에 매크로 상수의 값을 확인해 볼 수 없으며 아무리 간단한 버그라도 확인이 안되면 잡기가 어렵다. 반면 const 상수는 컴파일러가 처리하기 때문에 디버깅 중에도 값을 확인해 볼 수 있어 복잡한 단계를 통해 정의된 상수의 값도 쉽게 살펴볼 수 있다.
매크로는 기계적으로 치환되기 때문에 부작용이 발생할 소지가 많다. 괄호를 싸지 않으면 연산 순위에 의해 예상하지 못한 값이 될 위험이 있다. 그러나 const 상수는 컴파일러가 문맥에 맞게 처리하므로 이런 부작용이 거의 없다. #define A 1+2의 A는 3이 될 가능성이 있을 뿐 주변 연산문에 따라 3이 아닐 수도 있지만 const int A=1+2;는 어떤 경우라도 3이다.

#define이 C에서 사용하던 방법이라면 const는 C++에서 새로 도입된 좀 더 진보된 방법이다. 그래서 상수를 정의할 때는 가급적이면 #define보다는 const를 사용할 것을 더 권장하는 편이다. 그러나 const가 #define보다는 더 좋은 방법임이 분명하지만 #define도 나름대로 간편하고 편리하기 때문에 아직까지도 습관적으로 #define을 애용하는 경우가 더 많으며 굳이 금기시할 필요까지는 없다.


댓글 1개:

  1. 그리고 덧붙이자면 요즘엔 전처리기(preprocessor)를 사용하지 않도록 코딩하는 것이 추세라고 합니다..

    답글삭제