C언어 상수 리터럴 상수와 기호 상수 const 예제

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;어떤 차이가 있는지 의문이 들 수 있습니다.

즉 변수와 상수는 어떤 차이가 있는지에 대한 질문과 동일한 의문입니다.

변수 THREETHREE에 변수값을 계속 다양하게 대입할 수 있습니다. 즉 변수값은 계속 변할 수 있습니다.

#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에서 상수값만 한꺼번에 조절할 수 있기 때문입니다.