[Programming Language]/[C언어]

[C언어] :: 상수(리터럴 상수, 심볼릭 상수, const, define)

Semincolon 2024. 1. 26. 10:54

◎ 상수

  C언어에서 변수는 언제든 값이 변할 수 있었다. 그러나 상수는 최초로 값이 선언된 이후에는 절대 값이 변경될 수 없다. 상수는 크게 리터럴 상수심볼릭 상수로 나눌 수 있다.

  상수는 왜 사용하는 것일까? 만약 코드 내에서 원주율 값을 3.14로 사용했다고 가정해보자. 그런데 이 값을 보다 구체화 하기 위해 3.141592로 수정하려 하면 코드 내에서 3.14가 사용된 부분 전체의 수정이 필요하다. 이는 매우 번거로운 작업이다. 그런데 만약 3.14라는 값을 상수로 사용한다면 상수화 하는 부분 1곳만 수정을 하면 되므로 상수를 사용하는 것이다.
  • 리터럴(Literal) 상수 : 글자 그대로 의미가 있어서 이름이 없는 상수
  • 심볼릭(Symbolic) 상수 : 상수를 기호화하여 변수처럼 이름을 지어 쓰는 상수

1) 리터럴 상수

  숫자 1, 2, 3이나 문자 a, b, c는 이미 그 자체로도 값을 지니고 있다. 이러한 것처럼 이미 그 자체로 의미를 갖는 것들을 리터럴 상수라고 한다. 리터럴 상수의 종류에는 정수형 상수, 실수형 상수, 문자 상수, 문자열 상수가 있다.

 

  1-1) 정수형 상수

  C언어에서 정수형 상수는 10진수, 16진수, 8진수의 형태로 표현한다. 정수형 상수들의 출력 서식, 표현 방법, 사용 예는 아래 표와 같다.

정수형 상수 출력 서식 표현 방법
10진수 %d 10, 20, 30, ... int a=30;
printf("%d \n", a);
16진수 %x 0x10, 0x20, 0x30, ... int b=0x30;
printf("%x \n", b);
8진수 %o 010, 020, 030, ... int c=030;
printf("%o \n", c);
#include <stdio.h>
int main() {
	int num1 = 100;
	printf("100은 10진수로 %d, 16진수로 %x, 8진수로 %o \n\n", num1, num1, num1);
	
	printf("10진수 : %d, %d, %d \n", 10, 20, 30);
	printf("16진수 : %x, %x, %x \n", 0x10, 0x20, 0x30);
	printf("8진수 : %o, %o, %o \n", 010, 020, 030); 
	
	return 0; 
}

 

  1-2) 실수형 상수

  실수형 상수는 말 그대로 소숫점이 포함된 상수이다. 실수형 상수를 사용할 때 서식문자는 %f보다는 주로 %lf를 많이 사용한다.

#include <stdio.h>
int main() {
	printf("실수형 상수 : %f, %lf \n", 2.4, 3.5);
	
	return 0; 
}

 

  1-3) 문자 상수

  문자 상수란 작은 따옴표(' ')로 묶은 문자 하나를 의미한다. 문자가 어떻게 상수가 될 수 있는지가 의문일 수도 있는데 이는 ASCII 코드가 해결해준다. 각 문자는 ASCII 코드표에 해당하는 정수 값이 정리되어 있다. 예를 들어 문자 a의 정수 값은 97, 문자 A의 정수 값은 65이다. 추가로 문자 상수는 주로 char형 변수에 저장한다.

#include <stdio.h>
int main() {
	char c1 = 'a';
	
	printf("문자형 변수 'a' : 10진수로 %d, 문자는 %c \n", c1, c1);
	
	return 0; 
}

 

  1-4) 문자열 상수

  문자열 상수란 큰 따옴표(" ")로 묶은 하나 이상의 문자로 구성된 문자열을 의미한다. 문자열 상수를 출력하기 위해서는 서식문자 %s를 사용한다. 문자열 상수는 서식문자 %c로는 출력할 수 없고, 반대로 문자 상수는 서식문자 %s로 출력할 수 없다.

#include <stdio.h>
int main() {
	printf("문자열 : %s \n", "Hello!");
	printf("서식문자 %%c로는 문자열 출력 불가 : %c \n", "Hello!");
	
	return 0; 
}

 

 

2) 심볼릭 상수

  심볼릭(Symbolic) 상수는 상수를 기호화하여 의미 있는 이름으로 지어서 쓰는 상수를 의미한다. 즉, 임의의 변수를 상수로 만들어 사용하는 것이다. 변수를 상수화 한 뒤에는 절대로 값을 변경할 수 없다. 심볼릭 상수의 이름은 모두 대문자로 표시하도록 한다. 이를 위해서는 const 키워드를 사용하는 방법과 매크로 상수(#define)을 사용하는 방법이 있다.

 

  2-1) const 키워드 사용

  const 키워드는 변수의 선언부 맨 앞쪽에 붙여 사용하면 된다. const 키워드를 사용한 변수의 값은 절대로 변경될 수 없다. 그렇기 때문에 변수의 선언과 함께 값을 초기화 해야 한다.

#include <stdio.h>
int main() {
	const float PI = 3.14;
	/* <선언 후 초기화를 하게 되면 오류가 발생함> 
	const float PI;
	PI = 3.14;
	*/ 
	printf("원주율 PI 상수 : %lf \n", PI);
	
	/* <상수의 값을 변경하려 하면 오류가 발생함>
	PI = 3.141592;
	*/ 
	
	return 0; 
}

 

  2-2) 매크로 상수 #define 사용

  두 번째 방법은 매크로 상수 #define을 사용하는 방법이다. #이 붙어있으므로 이는 전처리기에서 수행되는 문장이다. 따라서 이는 코드의 상단에 사용하도록 한다.

#include <stdio.h>

#define PI 3.14
#define YEAR 2024

int main() {
	printf("매크로 상수 PI : %lf \n", PI);
	printf("매크로 상수 YEAR : %d \n", YEAR); 
	
	return 0; 
}