본문 바로가기

Programming/[C, C++]

[C] 심볼릭 상수 지정하기

반응형

심볼릭 상수

 

상수를 기호화하여 의미있는 이름으로 지어서 쓰는 상수를 의미

변수를 상수화 하는 것입니다.

 

심볼릭 상수를 만드는 방법은 크게 두 가지입니다. 첫째는 const 키워드를 이용하는 것이고

둘째는 매크로 상수를 이용하는 것 입니다.

 

 

1. const 키워드를 이용

 

다음 예제를 보며 알아보겠습니다.

#include <stdio.h>
int main(void)
{
    const int NUM = 100;
    const double PI = 3.14;

    // NUM = 200;
    // PI = 4.14;

    return 0;

}

4,5행에서 const 키워드를 이용 , 변수 NUM, PI를 상수로 만들었습니다.

지금부터 100을 NUM, 3.14를 PI라고 대신 쓰면 됩니다.

 

7,8행 주석을 제거하고 컴파일을 하면 에러가 발생합니다.

NUM,PI는 심볼릭 상수로 선언하고 초기화 됐기 때문에 값을 변경할 수 없습니다.

 

// symbolic_const.c: In function 'main':
// symbolic_const.c:7:9: error: assignment of read-only variable 'NUM'
//      NUM = 200;
//          ^
// symbolic_const.c:8:8: error: assignment of read-only variable 'PI'
//      PI = 4.14;

다음과 같은 에러코드가 나타난다.

 

심볼릭 상수를 만들 때 주의점은 선언과 동시에 초기화(값을 입력)를 해야합니다. 

초기화 하지 않았을 때 왜 문제가 되는지 살펴보겠습니다.

#include <stdio.h>
int main(void)
{
    const int NUM;
    NUM = 100;

    return 0;

}

4행에서 NUM을 심볼릭 상수로 선언하고 초기화는 하지 않았습니다. 이때 5행의 입력을 받진 않지만

의미없는 값을 상수로 가지고 있는 상태가 됩니다. 위 코드를 컴파일하면 당연히 에러가 발생합니다.

/* 심볼릭 상수를 선언하고 초기화는 하지 않음
   현재 NUM은 아무 의미 없는 값이 상수화 됨. 따라서 컴파일 에러 발생 */

// symbolic_const_error.c: In function 'main':
// symbolic_const_error.c:5:9: error: assignment of read-only variable 'NUM'
//      NUM = 100;
//          ^

 

2. #define 문을 이용하기

 

#define 문을 이용해 다음과 같이 입력합니다.

#include <stdio.h>

#define PI 3.14                   // 3 ~ 5행의 #define 문은 전처리기에서 수행되는 문장
#define NUM 100                   // 컴파일러가 소스 파일을 컴파일 하기전에 먼저 수행
#define BUFFER_SIZE 200           // 프로그램에서 여러 번 사용되는 상수 값을 매크로 상수로 정의해서 사용

// 수정의 편의성 때문에 리터럴 상수가 아닌 심볼릭 상수를 사용함.
int main(void)
{
    printf("%lf \n", PI);
    printf("%d \n", NUM);
    printf("%d \n", BUFFER_SIZE);

    return 0;
}

전처리기는 컴파일러가 소스파일을 컴파일하기 전에 수행하는데

#define문은 전처리기에서 수행되는 문장입니다.

 

 

3. 심볼릭 상수를 왜 사용할까요??

 

리터럴 상수를 사용할 경우 프로그램 내에서 리터럴 상수 100번 사용할 경우 값이 변경될때 100번 수정해야하는 문제가 발생 합니다. 이러한 번거로움을 막기위해 심볼릭 상수를 사용합니다.

 

실수형 상수를 심볼릭 상수로 정의해두었다면 한 번의 수정으로 문제를 해결할 수 있습니다.

반응형