C언어 상수란 변하지 않는 값을 말합니다. 상수에는 리터럴 상수와 기호 상수가 있습니다. 상수와 변수의 차이점은 상수는 상수값이 변할 수 없지만, 변수는 변할 수 있습니다.
C언어 상수
상수는 변하지 않는 값을 말합니다. 프로그래밍에서 등호 =
의 의미는 우변의 값을 좌변에 대입하라는 의미입니다. 즉 상수값을 변수명에 대입하는 것입니다.
변수명 = 상수값;
예를 들어 a = 1;
의 의미는 변수 a
에 우변 1
을 대입하라는 의미입니다. 따라서 변수는 우변의 상수값에 따라서 변수값이 계속 변할 수 있습니다. 변수 a
는 값이 계속 변합니다.
#include <stdio.h>
void main()
{
int a = 1; //변수 a에 1 대입
printf("현재의 a값은 %d 입니다. \n", a);
a = 2; //변수 a에 2 대입
printf("현재의 a값은 %d 입니다. \n", a);
a = 3; //변수 a에 3 대입
printf("현재의 a값은 %d 입니다. \n", a);
}
결과
변수 a
에 어떤 정수값(int
)을 넣어도 모두 a
의 값을 변화시킬 수 있습니다.
현재의 a값은 1 입니다.
현재의 a값은 2 입니다.
현재의 a값은 3 입니다.
그런데 숫자 1
, 문자열 "가나다"
와 같은 상수값에는 어떤 값을 대입하는 것은 불가능합니다. 아래와 같은 수식은 존재하지 않습니다.
1 = 2; //상수 1에 숫자 2 대입
"ABC" = 3; //문자열 ABC에 숫자 3 대입
좌변의 숫자에 우변의 변수명 a를 대입하는 것도 불가능합니다.
1 = a;
3 = a;
5 = a;
C언어 상수 종류
C언어 상수의 종류에는 리터럴 상수와 기호 상수가 있습니다.
리터럴 상수는 정수 3
, 실수 2.5
, 문자 'A'
, 문자열 "ABC"
와 같은 형태를 말합니다.
기호 상수는 상수를 다른 문자로 치환을 하는 방법을 말합니다.
리터럴 상수
리터럴 상수는 일반적인 숫자나 문자, 문자열의 형태를 말합니다.
기호 상수
기호 상수는 상수가 변수 처럼 다른 문자로 치환되는 형태입니다.
기호 상수에는 const
를 이용한 방법은 해당 파트에서 설명하고, #define
을 사용한 방법은 전처리기 파트(하단 내부 참조 링크)에서 설명합니다.
기호 상수는 선언시 상수명 앞에 const
를 붙입니다.
const 자료형 상수명 = 상수값;
문자 THREE
의 자료형이 int
이고, 상수(const
)임을 선언하는 예제입니다.
#include <stdio.h>
void main()
{
const int THREE = 3;
printf("THREE는 정수 %d 을 말합니다.", THREE);
}
기호 상수 vs 변수
변수 int THREE = 3;
과 상수 const int THREE = 3;
어떤 차이가 있는지 의문이 들 수 있습니다.
즉 변수와 상수는 어떤 차이가 있는지에 대한 질문과 동일한 의문입니다.
변수 THREE
는 THREE
에 변수값을 계속 다양하게 대입할 수 있습니다. 즉 변수값은 계속 변할 수 있습니다.
#include <stdio.h>
void main()
{
int THREE = 3; //변수 THREE에 3 대입
printf("%d \n", THREE);
THREE = 5; //변수 THREE에 5 대입
printf("%d \n", THREE);
THREE = 7; //변수 THREE에 7 대입
printf("%d \n", THREE);
}
결과
3
5
7
하지만 상수 THREE
는 새로운 값을 대입할 수 없습니다. 순수 정수 3
으로 계속 사용되야 합니다.
#include <stdio.h>
void main()
{
const int THREE = 3; //상수 3을 문자 THREE로 치환
printf("%d", THREE);
THREE = 5; //상수이므로 정수 5를 대입할 수 없음
printf("%d", THREE);
THREE = 7; //상수이므로 정수 7을 대입할 수 없음
printf("%d", THREE);
}
결과
컴파일 오류
따라서 어떤 숫자 값이 실수라도 변하지 않아야 하는 상황이라면 상수로 지정해서 사용하는 것이 유리합니다. 반면 계속 변해야 되는 수라면 변수로 지정하는 것이 유리합니다.
리터럴 상수 vs 기호 상수
예를 들어 어떤 코드에 숫자 100
이 계속 나온다면 일일이 100
을 적는 것 보다 Hundred
와 같은 문자로 치환하는 것이 가독성이나 차후 편집 측면에서 유용할 것입니다. 그럴 경우 나중에 숫자 100
의 값을 수정할 경우 const Hundred
에서 상수값만 한꺼번에 조절할 수 있기 때문입니다.