[C언어/C++] 상수 선언하기 const, define의 차이점

상수란?

상수는 변하지 않는 값을 뜻합니다. 값을 계속 바꿀 수 있는 변수와는 달리 상수는 처음 선언할 때 값을 할당받게 되면서 그 다음부터는 값을 바꿀 수가 없습니다. 그렇기에 상수를 선언하실때는 꼭 선언과 동시에 초기화를 같이 해야만 합니다. 상수는 값을 변경시키지 못하도록 제한하고 싶을때 사용합니다. 코딩을 하다보면 고정되어 있어야 할 값을 실수로 값을 바꿀 가능성이 있습니다. 그렇기에 변하지 않을 값이라면 상수로 만들어줌으로써 값을 바꾸는 것을 방지하고 코드의 의도를 명확하게 만들 수 있습니다.

 

상수 사용법

#include <stdio.h>

// define은 전처리기이므로 main밖에 써야함 (매크로 상수)
#define PI 3.141592 
#define COL 100 
#define ROW 200 

void main()
{
    // const 상수
    // 상수는 반드시 선언과 초기화를 동시에 해야 한다.
    // 일반적으로 상수는 대문자로 만듦
    const int WIDTH = 100;
    const int HEIGHT = 150;
    
    printf("WIDTH : %d\n", WIDTH);
    printf("HEIGHT : %d\n", HEIGHT);
    printf("PI : %lf\n", PI);
    
    printf("COL : %d\n", COL);
    printf("ROW : %d\n", ROW);
}

상수 사용법 예제

C언어에서 상수를 선언하는 방법은 const를 사용하여 상수를 만드는 방법이 있고 define을 활용하여 매크로 상수를 만들어 값을 치환시키는 방법이 있습니다. 그리고 두가지 방법 중 const를 사용하는 방법이 좀 더 효율적이라고도 많은 분들이 알고 있습니다. 그렇다면 왜 const가 define보다 효율적인 것일까요?

 

const와 define의 차이점 (const가 define보다 효율적인 이유)

 #define PI 3.141592  
define은 단순히 치환 시켜준다는 의미입니다. 위 코드를 보면 우리눈에는 PI 라는 기호식 이름으로 보이지만 컴파일러 눈에는 3.141592라는 값으로 치환되어 보일 뿐이죠. 선행처리자가 컴파일 전에 치환시켜버렸기 때문입니다. 치환과정에서 한번의 연산이 들어가야해서 연산상의 불이익도 있고 또 컴파일러가 쓰는 기호 테이블에 들어가지 않게 됩니다. 이렇게 기호 테이블에 들어가지 않으면 에러가 발생할때 원인을 힘들수도 있고 다양한 문제가 발생합니다.

 

 const double PI = 3.141592; 

하지만 위와 같이 const를 사용하여 상수화 하면 컴파일 과정에서 이 변수를 상수로 인식하게 됩니다. 그렇기에 컴파일러가 사용하는 기호 테이블안에도 들어가게 됩니다. 또한 const를 사용하게 되면 컴파일 과정에서 상수 하나를 계속 돌려 쓰게되지만 define을 사용하였을 경우는 define으로 정의된 값들을 치환하는 과정에서 사용한 상수만큼의 사본이 생겨나게 되어 효율적인 부분에서도 좋지 않습니다.

 

결론 : 상수를 사용할때는 define이 아닌 const를 사용하도록 합시다.

댓글

Designed by JB FACTORY