C와 C++에서는 여러 가지 방법으로 상수를 선언할 수 있습니다. 각 방법을 살펴보기에 앞서, 먼저 상수가 무엇인지 정확히 이해해야 합니다.
상수란 무엇인가?
상수(Constant)란 변경할 수 없는 값을 의미합니다. 프로그래밍 관점에서 보면, 상수는 변수에 할당되는 고정된 값으로 프로그램 실행 중에 다른 변수나 구성 요소가 이를 임의로 변경할 수 없습니다. 상수는 어떤 데이터 타입으로도 선언할 수 있으며, 프로그램 내에서 변하지 않는 요소를 정의할 때 사용됩니다. 예를 들어 원주율(π)은 3.14라는 고정된 실숫값을 가지므로 상수로 선언하기에 적합한 대표적인 예입니다.
변수를 상수로 선언하는 다양한 방법
const 키워드 사용 − 변수를 상수로 만드는 가장 널리 사용되는 방법입니다. const로 선언된 상수 변수의 값을 변경하려고 시도하면 컴파일러가 오류 메시지를 출력합니다.
예제
#include<stdio.h>
int main(){
const int value = 5;
printf("value of constant variable is : %d ",value);
// 상수 변수의 값을 변경 시도
value = 8;
return 0;
}
출력 결과
이 코드의 출력 결과는 다음과 같습니다.
||=== Build file: "no target" in "no project" (compiler: unknown) ===| C:\Users\dell\OneDrive\Documents\test.c||In function 'main':| C:\Users\dell\OneDrive\Documents\test.c|7|error: assignment of read-only variable 'value'| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
읽기 전용(read-only)으로 선언된 변수에 새 값을 할당하려 했기 때문에 컴파일 오류가 발생하는 것을 확인할 수 있습니다.
열거형(Enum) 생성 − 열거형 역시 상수 값들의 집합을 만드는 데 사용됩니다. Enum은 C와 C++을 포함한 많은 프로그래밍 언어에서 지원하는 사용자 정의 데이터 타입입니다. 예를 들어 12개월처럼 고정된 순서와 값을 가지는 데이터는 열거형으로 정의하기에 매우 적합합니다.
예제
#include<stdio.h>
enum months{Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
int main(){
int i;
printf("values are : ");
for (i=Jan; i<=Dec; i++)
printf("%d ", i);
return 0;
}
출력 결과
이 코드의 출력 결과는 다음과 같습니다.
values are : 0 1 2 3 4 5 6 7 8 9 10 11
열거형의 각 멤버는 기본적으로 0부터 시작하는 정숫값이 순서대로 자동 할당됩니다.
매크로(Macro) 사용 − 매크로는 전처리기 지시문의 한 종류로, 특정 이름이 붙은 코드 조각입니다. '#define'을 사용하여 생성하며, 컴파일러가 코드에서 매크로 이름을 만나면 해당 코드로 치환합니다. 따라서 매크로도 일종의 상수 값이라고 볼 수 있습니다.
예제
#include<iostream>
using namespace std;
#define val 10
int main(){
val++; // 상수 값은 수정할 수 없음
return 0 ;
}
출력 결과
이 코드의 출력 결과는 다음과 같습니다.
Main.cpp:6:8: error: expression is not assignable
예제
#include<iostream>
using namespace std;
#define val 10
int main(){
int product = 1;
cout<<"Value of Macro val is : "<<val;
for(int i=0;i<val;i++){
product=product*val;
}
cout<<"\nProduct is: "<<product;
cout<<"\nValue of Macro val after modifying it is : "<<val;
return 0 ;
}
출력 결과
이 코드의 출력 결과는 다음과 같습니다.
Value of Macro val is : 10 Product is: 1410065408 Value of Macro val after modifying it is : 10
세 가지 방법 비교 및 정리
각 방법에는 고유한 특징이 있습니다. const 키워드는 타입 검사를 수행하고 디버깅이 용이하여 일반적으로 가장 권장되는 방식입니다. 열거형(Enum)은 서로 연관된 정수 상수들을 하나의 그룹으로 묶을 때 유용합니다. 반면 매크로는 타입 검사 없이 단순 텍스트 치환만 이루어지므로 예기치 않은 버그를 유발할 수 있어 신중하게 사용해야 합니다. 참고로 C++11부터는 컴파일 타임에 값이 확정되는 상수를 정의할 수 있는 constexpr 키워드도 제공되므로, 상황에 맞는 방법을 선택하는 것이 중요합니다.