[C언어 강좌] #5-1 상수 이용하기(Constant)


안녕하세요 파일입니다. 오늘 알아볼 것은 상수입니다. 

원의 넓이를 구할 때 공식은 πr^2이며 π는 3.141592... 의 값을 가집니다. r(반지름)의 값은 변해도

π의 값은 변하지 않는데 이러한 것을 상수라고 합니다.

(물론 이례적인 천재 수학자가 이 값을 재조정할 가능성은 있겠죠.)

 

즉 프로그램 실행도중 값이 변하지 않는 데이터를 의미합니다.

 


상수에는 2가지 종류가 있습니다

리터럴 상수 (Literal) 글자 그대로 의미가 있어 이름이 없는 상수
심볼릭 상수 (Symbolic) 상수를 기호화 하여 변수처럼 이름을 지어쓰는 상수

이렇게 보니 감이 잘 안 오죠? 하나하나 차근차근 알아보겠습니다.

 

리터럴 상수

 

영어에서 a, 숫자에서 10 은 글자 그대로 의미를 가집니다. 알파벳 a라는 기능과 숫자 10이라는 기능을 하죠.

이렇게 글자 그대로 의미가 있는 상수들을 리터럴 상수라고 합니다.

 

우리가 흔히 쓰는 10진수와 컴퓨팅에서 사용되는 16진수, 8진수는 정수형 상수라고 합니다.

정수형 상수 출력 서식 문자 표현 방법
10진수 %d 1,2,3,4,6,7,8,9,10...
16진수 %x 0x10, 0x20, 0x30
8진수 %o 010, 020, 030 ...

어려워하실 거 없습니다. 그냥 저번에 배웠던 내용들이니깐요.

추가로 알아두실 점은 16진수를 표기할 때는 반드시 앞에 0x를 붙이고 8진수 표현 시에는 숫자 0을 붙여줘야 컴퓨터가 알아듣고 인식합니다.

 

#include <stdio.h>

int main(){
	printf("%d %d \n", 10,20);
	printf("%x %x \n", 0x10,0x20);
	printf("%o %o", 010,020);
	return 0;
}


10 20
10 20
10 20
--------------------------------
Process exited after 0.01991 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

다음은 정수형 상수를 출력하는 예제입니다.

 

 

그다음으로 알아둘 것은 실수형 상수입니다. 앞에서 % f와 % lf로 출력하던 실수들이 전부 실수형 상수입니다.

5.9 , 4.9 글자 그대로 실수의 의미를 갖습니다.

 

#include <stdio.h>

int main(){
	printf("문자 상수 %c %c \n", '!', '@');
	printf("문자열 상수 %s %s \n", "ABCD", "EFG");
	printf("문자열 상수 %c %c \n", "ABCD", "EFG");
	return 0;

}
문자 상수 ! @
문자열 상수 ABCD EFG
문자열 상수  

--------------------------------
Process exited after 0.02033 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

마지막으로 문자 상수문자열 상수입니다.

이를 듣고 의아해하실 수 있는데 왜 알파벳이나 특수문자가 상수인지입니다.

실제로 컴퓨터는 우리가 사용하는 문자를 인식하지 못합니다. 잘 알듯이 이진법을 사용하기 때문인데요. 그렇기 때문에 통신을 위해 문자에 대응하는 부호체계를 만들었는데 이것이 ASCII 코드입니다.

 

https://www.asciitable.com/ 이 곳에서 아스키코드 값을 확인할 수 있습니다.

알파벳 a에는 아스키코드 값 97이 대응되고 이런 식입니다.

 

문자열 한 개를 ' (작은 따옴표)로 묶었을 때 이것을 문자 상수라고 하고

문자열 여러 개를 "(큰 따옴표)로 묶었을 때 이것을 문자열 상수라고 합니다. (문자의 나열)

 

즉 문자 상수를 표현할 때는 % c 문자 한 개를 표현하는 서식 문자를 이용해야 하고

문자열을 표현할 때는 % s를 이용해야 합니다.

 

 

컴파일러에서 "(큰 따옴표)가 붙으면 그 문자 끝에 종료 문자(\0 = NULL)를 자동으로 추가하고 % s로 출력합니다.

위에 예제를 보면 문자열 "ABCD"를% c로 표현하니 출력이 되지 않고 이상한 문자로 깨져서 출력이 됩니다.

즉 큰 따옴표가 있으면 문자열 상수이고 작은 따움 표면 문자 상수입니다.

 

#include <stdio.h>

int main(){
	printf("ASCII 코드 값 :  %c %c %c %c\n", 'a', 'b', 'c', 'd');
	printf("ASCII 코드 값 :  %d %d %d %d", 'a', 'b', 'c', 'd');
	return 0;
}

ASCII 코드 값 :  a b c d
ASCII 코드 값 :  97 98 99 100
--------------------------------
Process exited after 0.01891 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

문자 상수를 % d로 출력해보니 Ascii 코드 값을 확인할 수 있네요!

ASCII 코드에 의해 문자가 정수로 대응됐으니 컴퓨터는 저 값을 이진수로 인식하겠죠 ^^? 

결국 문자를 인식할 수 있게 된 겁니다.

 

추가로 "S"는 문자열일까요 문자 상수일까요?

 

#include <stdio.h>

int main(){
	printf("문자열 :  %c \n", "S");
	printf("문자열 :  %s", "S");
	return 0;
}


문자열 :
문자열 :  S
--------------------------------
Process exited after 0.02052 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

정답은문자열입니다. 큰 따옴표가 붙었으니깐요.

 


심볼릭 상수

수학에서 파이라는 기호는 3.141592... 의 의미를 가지고 있습니다.

이렇게 상수(이 경우에는 숫자 상수)를 기호화하여 의미 있는 이름으로 지어서 쓰는 것이 심볼릭 상수입니다.

우리가 대부분 알고 있는 상수의 개념이 바로 이것입니다.

 

C언어에서 심볼릭 상수를 정의하는 건 2가지 방법이 있습니다.

 

1. const 키워드 이용

#include <stdio.h>

int main(){
	const double PI = 3.14;
	const double H = 6.6 * 10E-034;
	
	printf("%f %e", PI, H);
}

3.140000 6.600000e-033
--------------------------------
Process exited after 0.02032 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

const 상수를 사용할 때는 const 자료형 이름의 형태로 만들어 주시면 됩니다.

변수의 사용과 유사합니다. 그냥 앞에 const를 붙여주면 됩니다. (상수라는 뜻)

보통 잘 알아보기 위해 대문자로 하는 게 관례입니다.

 

#include <stdio.h>

int main(){
	const double PI ; //오류 발생
	const double H = 6.6 * 10E-034;
	
	printf("%f %e", PI, H);
}

주의할 점은 선언과 동시에 초기화를 해줘야 합니다.

선언과 동시에 초기화를 하지 않으면 PI 에는 아무 의미 없는 NULL 값이 들어가게 되고 컴파일 에러가 발생합니다.

 

1. #define 문 이용 (매크로 상수 정의)

#include <stdio.h>

#define PI 3.14
#define H 6.6 * 10E-034
#define NUM 1000

int main(){

	printf("%f %e, %d", PI, H, NUM);
}

3.140000 6.600000e-033, 1000
--------------------------------
Process exited after 0.02101 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

 

다음 예제는 #define 문을 이용하여 상수를 정의하는 방법입니다

const와 다른 점은 #은 전처리기에서 수행되는 문장이기 때문에 main 함수 바깥에서 stdio.h 를 임포트 할 때와 동일한 방식으로 사용해야 합니다. 또한 자료형과 대입 연산자를 사용할 필요가 없습니다.

 


프로그래밍을 할때 상수를 사용하는 이유는 편리 때문입니다.

꼭 사용하는 숫자나 자주 사용하는 숫자가 번거로운 숫자라면, 이를 상수화 시키고 사용하면 됩니다.

 

심볼릭 상수가 10000번 , 20000번 호출되었을 때 숫자를 바꾸고 싶을 때도 부담을 가질 필요 없습니다.

그냥 위 선언에서 값만 바꿔주면 되기 때문입니다. 

 

이해가 되셨나요 ^^? 다음 편에서는 연산자에 대해 알아보겠습니다. 감사합니다.

COMMENT WRITE