두 번째 강의

Aritficial IntelligEnce SystEm	C Language Study

ais.daegu.ac.kr                                                                      2007.03.23

안녕하세요~ C 언어 두 번째 강의 시작하겠습니다. 이번 시간의 주제는 변수, 상수, 자료형입니다. C 언어의 초반부이니 만큼 어려운 내용은 없으니 가볍게 읽어주세요.

아래 소스를 한번 분석 해볼까요~

그림 1. Sum.c

사실 분석이랄 것도 없지만 이 글을 읽는 사람들은 C에 대해 전혀 모른다는 전제하에 설명하겠습니다. 저번 시간에 제대로 공부한 사람들이라면 1, 3, 7번 줄의 내용이 무엇을 의미하는지 다들 알겠죠? 5, 6번 줄은 처음 보는 것들이군요.

그럼 들이대 봅시다.

▪ int sum은 머야?

▪ sum=2+5은 덧셈이자나~

그럼 첫 번째 궁금증부터 고고.

▪ int sum은 머야?

위에 대한 답변을 하기 전에 변수에 대해 얘기해 봅시다. 변수란 데이터를 저장할 수 있는 메모리 공간에 붙여진 이름을 의미합니다. 여기서 말하는 메모리 공간이란 램을 의미합니다. 그럼 데이터를 저장하기 위해서는 메모리 공간이 필요하다는 얘기인데 메모리 공간을 어떻게 얻어올까요? 바로 위 소스의 5번 줄에 있는 int라는 키워드를 통해 메모리 공간을 얻어오는 겁니다. int sum을 선언함으로써 4바이트 메모리 공간이 할당되고 그 메모리 공간에 “sum이라는 이름을 부여하겠다” 라는 뜻이 되는거죠~ 그리고 또 하나 int라고 선언함으로 써 sum이라는 변수는 정수형 변수라는 특징을 갖게 됩니다. 변수는 크게 정수형 변수와 실수형 변수 두 가지로 나뉩니다. 정수형 변수는 말 그대로 정수를 저장하기 위한 메모리 공간에 붙여진 이름이고, 실수형 변수는(소수점 이하 자리를 표현할 수 있는 수)를 저장하기 위한 메모리 공간에 붙여진 이름을 의미합니다. 중요한 거 하나를 빠트렸네요. 변수는 저장된 데이터 값의 변경이 가능합니다. 위의 소스에서 sum 이라는 변수에 10이라는 정수를 저장하고 있다가 -5555라는 값으로 저장할 수 있다는 뜻입니다. 하지만 이와는 반대된 개념으로 상수라는 게 있습니다. 얘도 변수와 마찬가지로 데이터를 저장할 수 있지만 한번 저장한 값을 다시 바꿀 수 없습니다. 상수에 대한 것은 뒤에서 다시 설명하겠습니다. 아래 표를 한번 봅시다.

표 . C 언어 기본 자료형

자료형(data type)		할당되는 메모리 크기	표현 가능한 데이터의 범위
정수형	char	1 바이트	-128 ~ 127
	short	2 바이트	-32768 ~ 32767
	int	4 바이트	-2147483648 ~ 2147483647
	long	4 바이트	-2147483648 ~ 2147483647
실수형	float	4 바이트	C 책 참고
	double	8 바이트	C 책 참고
	long double	8 바이트	C 책 참고

위의 표에서 보듯이 변수를 선언할 때는 int형 뿐만이 아니라 다양한 타입이 존재합니다. 선언할 변수의 특징을 나타내기 위한 키워드들 char, int, double 등을 가리켜 “자료형“ 또는 ”데이터형“이라고 합니다. 일반적으로 정수형 자료형 앞에는 signed, unsigned라는 키워드가 붙습니다. 다만 signed의 경우 이를 생략해서 사용합니다. 예를 들어 char 앞에 unsigned라는 키워드를 붙이면 0~255까지의 표현이 가능합니다. 음수를 제외한 양수를 표현한다고 보면 되겠죠. 이런식으로 자료형을 나눠놓은 이유는 크게 두가지로 나눌수 있는데 첫째는 정수형과 실수형이 컴퓨터가 내부적으로 처리하는 방식이 다르기 때문이고 둘째는 메모리 공간을 적절히 사용하기 위함입니다.

일반적으로 정수형 데이터를 처리하기 위해서는 char형 보다 int형을 쓰는것이 일반적입니다. 예를 들어 저장할 데이터가 -128~127 사이라면 char형을 써서 메모리를 절약할 수 있지만 메모리 낭비가 발생하더라고 int형 변수를 쓰는 것이 보편적이라는 것입니다. 이는 컴퓨터가 내부적으로 int형 데이터를 가장 빠르게 연산하기 때문입니다. CPU가 char형으로 선언된 변수를 읽으면 내부적으로 4바이트를 쉬프트 연산을 통해 데이터가 들어있는 1바이트로 접근 하게 됩니다.(※ARM의 경우) 이로 인한 오버헤드가 발행한다는 얘기지요. 하지만 정수가 아닌 문자를 표현할때는 int형보다 char형을 사용하는 것이 일반적입니다. 그냥 그렇구나 하고 넘어가도 됩니다. 웬만해선 속도 체감을 느낄 수 없으니.... -_ㅡ;;  하지만 임베디드 분야에서는 이러한 것들이 때론 중요하게 여겨집니다.

▪ sum=2+5은 덧셈이자나~

네~ 덧셈 맞습니다. 2+5를 더해서 그 결과 값을 sum이라는 이름을 갖고 있는 변수에 저장하겠다는 의미입니다. 여기서 “=“은 같다는 뜻이 아니라 오른쪽에 있는 값을 왼쪽의 변수에 대입하겠다! 라는 뜻입니다. 이름하여 대입연산자~ 여기까지는 쉽죠. 사실 소스의 6번째 줄에서 제가 진짜로 하고 싶었던 얘기는 상수입니다. 위쪽에서도 잠깐 언급했었죠. 변수와 상수. 변수는 저장했던 값을 다른 값으로 저장할 수 있고, 상수는 한번 초기화되면 프로그램 실행 동안 다른 값으로 변경 할 수 없다고. 상수는 또다시 2가지로 분류되는데 리터럴 상수(이름을 지니지 않는 상수)와 심볼릭 상수(이름을 지니는 상수)입니다. 그럼 아래 그림을 한번 보죠.

그림 2. 리터럴 상수

sum=2+5;는 컴파일 시에 중간 코드 최적화에 의해 sum=2+5;를 sum=7;과 같이 미리 상수 계산을 통해 바꾸게 됩니다. 여기서 sum에 대입되는 7이 바로 리터럴 상수입니다. 그림 2에서 보는 바와 같이 7이라는 값을 저장하는 메모리는 할당되었지만 변수 sum과 같은 이름을 지니지는 않습니다. 이처럼 이름이 없는 상수를 리터럴 상수라 합니다. 어렵지 않지요? 그럼 심볼릭 함수란? 대충 감이 오지 않나요. 이름을 갖고 있는 상수입니다. 우선 심볼릭 함수를 선언 하는 방법은 아래와 같습니다.

그림 3. 심볼릭 상수 선언

#define 명령을 통한 방법과 const 키워드를 통한 방법입니다. #define의 경우는 전처리 과정에서 VALUE라는 문자열이 나오면 3으로 치환을 하게 됩니다. 전처리라는 말은 앞 강의에서도 들었던 적이 있죠, 그렇습니다. 전처리 과정에서 헤더파일을 삽입하고 #define 명령어로 선언된 문자열을 치환하는 거죠. const로 선언된 상수 x는 값의 치환과는 상관없이  “int 형 변수 x를 상수화 하겠다!”라는 것으로 이해하시면 될 거 같습니다. 오늘 내용도 쉬웠죠~ 그럼 자료형, 변수, 상수 대한 강의를 끝내겠습니다. 더 자세한 내용은 C책을 참고하세요.

생각해보기

아래와 같은 경우는 어떻게 될까요?

그림 4. const 키워드를 이용한 심볼릭 상수 선언

한번씩 실행 해보세요. 어떤 에러가 나오는지.. 그리고 심볼릭 상수를 쓰는 이유에 대해서도 찾아보세요. 불시에~ 그 누군가에게~ 물어보겠슴.. ㅋ_ㅋ

//Error=> l-value specifies const object 상수 값을 변화시키려 할때 에러

//        x++, x=x+1 등 x에 어떤 값을 집어넣으려 하면 발생

//심볼릭 상수를 쓰는 이유? : 시간절약? 큰 프로그램에서 숫자를 변경 시킬때 일일이 고치//면 시간낭비~~ 한번에 고칠 수 있음...

그럼 이번 주 강의는 이걸로 마무리 짓겠습니다. 다음 주에 보아요! 잘못된 내용은 딴지 걸어 주세요.