반응형

사실 C언어 포스팅 하려니 시간이 너무 오래걸리고 귀찮아서... 안쓴감은 있지만 오랜만에 다시 C언어책을 보니 강좌를 계속 이어가야 겠다는 생각이 들었습니다.

 

이번에는 이론적인 면을 짚고 넘어갈까 합니다. 여태까지 너무 실습 위주로 하다 보니 정작 중요한 C언어 내의 이론적인 면에는 너무 소홀하지 않았나 합니다.

 

앞으로 배워야할 조건문, 반복문, 구조체 등등... 을 알고 실습하기 위해서라도 이론이 탄탄해야 한다는 생각이 더욱 듭니다.

 

그래서 당분간은 이론적인 면에 치중할 계획입니다.

 

-------------------------------------------------------------------------------------------

 

이번 시간에는 변수와 자료형에 대해서 짚고 넘어가겠습니다.

 

제가 여태까지 글을 쓰면서 int라던지 float을 사용하였는데 이런것이 정확히 어떤것이며 무슨 역할을

하는지는 필수적으로 짚고 넘어가야 합니다.

 

그리고 잠시 언급했던 C언어에서 기초중의 기초 변수에 대해서도 당연히 짚고 넘어가야 합니다.

 

 

1) 변수란 무엇인가?

 

프로그램은 반드시 데이터를 저장할 공간이 필요합니다.

 

컴퓨터는 제가 계속 지겹도록 말하지만 정말 멍청한 도구라서 미리 정해놓은게 없으면 아무것도 할줄

아는게 없습니다.

 

그래서 변수를 통해 데이터를 저장하고 그 저장된 데이터를 가지고 이리저리 갖고 놀면서 원하는 것을 얻어내야 하는데요.

 

예를 들어 학생들의 평균을 구하고 싶습니다.

 

A라는 학생은 80점 / B라는 학생은 90점 / C라는 학생은 100점이라고 칩시다.

 

그럼 이 각각의 점수들은 어떻게 해야 할까요?

 

각각 변수에 저장을 해서 그것을 연산하여 평균을 내야 합니다.

 

변수를 빈 상자라고 생각하면 쉽습니다. 각각의 상자에 학생 한명의 점수를 각각 보관한다음 그걸 연산 하는 겁니다. 그래서 결과적으로는 90점이라는 결과가 도출됩니다.

 

 

간단하게 그림으로 설명하겠습니다. 위에 있는 그림을 보면 i라는 상자에 12라는 숫자가 담겨져 있습니다.

 

이것은 이름이 i라고 지정된 변수에 12라는 숫자가 담겨 있는 겁니다.

 

이렇듯 변수에는 데이터가 담기게 됩니다.

 

하지만 원래 데이터는 메모리에 담겨져야 합니다. 우리가 생각하는 램(RAM)이 그 메모리입니다.

 

그래서 램의 용량이 클수록 버벅임이 덜하고 부드러워지는 것도 이런 이유입니다. 램의 용량이 크면

 

데이터를 담을 공간이 커짐으로써 처리하기가 한결 편해지는 것입니다.


하지만 메모리에 직접 데이터를 저장하는 것은 매우 불편합니다.

 

메모리에는 각 구역마다 주소가 존재 하게 되는데 만약 직접 데이터를 거기다가 저장하려고 하면

 

예를 들어 "300번지에 정수 30을 저장하라"와 같이 주소를 직접 지정해줘서 데이터를 저장해줘야 하는데 주소값이 매우 복잡하고 접근하는것이 변수를 이용하는것보다 간단하지가 않습니다.

 

하지만 C언어에서는 변수를 통해서 데이터를 변수에다가 넣으면 변수가 알아서 자동으로 메모리 주소에 배치되기 때문에 훗날 '포인터'를 사용하는 경우를 제외하고는 메모리 주소에 직접 접근할 필요가 없습니다.

 

- 메모리 안의 주소 0~4번지에 데이터를 직접 저장하는 경우 -



2) 변수와 상수(Variable and Constant)

 

제가 이전 강의 때 언급했었습니다. 변수라는 것은 변하는 숫자입니다.

 

변수는 예를 들어 13이라는 숫자를 저장했다 해도 때에따라 얼마든지 10이나 100등 다른 값으로 변경이 손쉽게 가능합니다.

 

예를 든다면 원의 면적을 구할때 원의 반지름은 때에 따라 변하기 때문에 원의 반지름을 변수로 둘수 있습니다.

 

상수는 변하지 못하는 숫자입니다. 프로그램이 실행되는 동안에는 값이 절대 변경되지가 않으며 프로그램이 끝나고 사용자가 임의로 숫자를 바꾸어 줘야 변경이 가능한 것이 상수입니다.

 

원의 면적을 구하는것을 예를 든다면 원주율은 절대불변의 숫자입니다. 3.141592.... 이죠.

 

원주율은 절대 변하지 않습니다. 그렇기 때문에 이런 숫자는 상수로 두면 됩니다.

 

상수는 변수가 아니기 때문에 따로 둘 필요 없이 비주얼 스튜디오 내에서 그냥 숫자만 적으면 됩니다.

 

원의 면적을 구하는 프로그램 코드를 직접 보여 드리며 설명을 할게요.

 

 

 

 


위의 코드는 원의 반지름을 입력하여 원의 면적을 구하는 프로그램의 예시입니다.

 

radius와 area는 변수로 지정되어 있습니다. 이것은 각각 반지름과 면적의 값을 저장하는데 쓰이구요.


원의 반지름을 float(소수점형)으로 두어 소수점 이하로도 값을 표현할수 있게 하였습니다.


그리고 area는 area = 3.14 * radius * radius 로 되어있는데 이것은 원의 면적 구하는 공식인


원의 면적 = 반지름 * 반지름 * π 를 이용한 겁니다.


scanf는 입력을 받는 함수인데요. &radius를 통해 변수 radius에 값을 입력하는 것입니다.


그래서 scanf를 통해 입력받은 radius 값을 밑의 area 공식의 radius에 넣는겁니다.


여기서 3.14는 상수입니다. 누가봐도 프로그램 실행되는 동안에는 숫자가 딱히 변할수가 없어 보이네요.


이렇듯 상수와 변수는 각각 쓰임새가 다릅니다. 적당한 변수와 상수의 활용은 프로그램 코드를 좀 더 효율적으로 만들어줍니다.


상수도 마찬가지로 메모리에 저장이 되며 다만 변경이 안된다고 일종의 태그가 붙어있는것 뿐입니다.


3) 자료형


자료형이라는 것도 이전에 살짝 언급을 했습니다. 자료형은 데이터의 종류를 지정해주는 것입니다.


데이터의 종류는 무궁무진 합니다.


8과 같은 정수도 있을 것이고 3.14592 같은 소수도 있을 것이며 A라는 문자도 있을 것이며 심지어 "Hello, World!" 라는 문자열도 있습니다.


하지만 문제점은 데이터가 종류마다 저장하는데 필요한 메모리 공간이 전부 다르다는 것입니다.


컴활이나 워드프로세서를 공부하셨던 분이라면 영어는 1byte, 한글은 2byte 라는것 정도는 아실겁니다.


그리고 단순히 생각해봐도 8이라는 숫자와 3.14592라는 숫자를 각각 저장하는데 필요한 공간이 다를겁니다.


왜냐하면 당연히 3.14592라는 숫자가 더 길기 때문에 더 큰공간이 필요할것이기 때문입니다.


그렇지만 메모리의 양은 한정되어 있습니다. 여러분들의 컴퓨터들은 일반적으로 램의 용량이 4GB나 8GB 정도 됩니다.


예를 들어 큰 공간을 할당한다음에 고작 1이라는 숫자를 저장한다고 하면 메모리 공간의 낭비가 매우 심각합니다.


그래서 메모리 공간을 효율적으로 사용하여 타이트하게 조여주는 것이 필요한데 이것이 바로 우리가 흔히 알고 있는 "최적화" 입니다.


최적화가 잘된 게임은 낮은 사양의 컴퓨터에서도 부드럽게 잘 돌아갈수 있겠지만 최적화가 제대로 안된 게임 흔히 말하는 발적화가 된 게임들은 높은 사양의 컴퓨터에서도 버벅이는 현상이 발생할것입니다.


흔히 우리가 물건을 정리할때 상자의 크기를 작은것부터 큰것까지 나누어서 물건을 담아내는것과 비슷하다고 생각하면 됩니다.


만약 물건을 크기가 작은데 우체국 택배 박스 가장 큰곳에다가 집어넣는다면 공간 낭비이며


물건의 크기가 큰데 우체국 택배 박스 가장 작은곳에다가 집어넣으려면 안들어갑니다.


C언어에서도 저장되는 데이터 크기에 따라 메모리 필요량이 달라지는데 이런 것 때문에 다양한 자료형이라는 것이 존재하게 됩니다.


즉 정수만을 담당하는 자료형, 실수만을 담당하는 자료형 등 적절한 자료형을 통해 메모리를 절약하고 실행속도를 빠르게 할수 있습니다.


자료형을 간단히 표현하자면 데이터의 종류라고 표현할수 있습니다.

변수는 특정한 자료형으로 생성되는데 예를 들면 int box 라는 변수를 지정할때 box는 변수 이름 int는 자료형입니다.


int는 정수만을 저장하게 하는 자료형입니다. 그렇기 때문에 int box에는 데이터가 오로지 정수여야만 합니다.


즉 int box = 1 은 제대로된 표현이지만 int box = 3.14 는 올바르지 못한 표현입니다.


자료형은 종류가 다양한데 크게 정수형 / 문자형 / 부동소수점 형으로 나눌수 있습니다.

 

정수형에는 정수 / 문자형에는 하나의 문자 / 부동소수점형은 실수 타입의 데이터를 저장합니다.


 

위의 그림이 결국 이번 파트의 핵심입니다.

 

저 표를 보시면 short, int, long 등 자료형이 있으며 각각의 역할 그리고 공간, 숫자 범위가 있습니다.

 

예를 들어 int 라는 자료형을 설명하겠습니다.

 

int는 정수형이며 메모리의 공간을 4byte를 할당합니다.

 

예를 들어 램의 용량이 8기가 바이트라 치면 8기가 바이트는 어림잡아 86억바이트이기 때문에

 

86억바이트 중에서 int는 4바이트를 할당받는 겁니다.

 

그리고 int는 숫자를 무한대로 표현할수가 없습니다. 약 -21억 ~ +21억의 숫자 정도를 표현할수 있는데

 

이것은 메모리 공간 4바이트가 이정도 밖에 표현을 못하기 때문입니다.

 

만약 더 큰 숫자를 표현하고 싶다면 자료형 double을 쓰면 거의 무한대의 숫자를 표현할수 있습니다.

 

 

 

하지만 저렇게만 봐서 못미더운 분들이 계실 겁니다. 정말 int가 4바이트 맞는건가? 라고 한다면 자료형의 크기를 프로그램으로 알아보는

방법이 있습니다.

 

함수 sizeof를 이용하면 됩니다. sizeof는 변수나 자료형의 크기를 바이트 단위로 변환시킵니다.

 

예를 들어 x라는 변수의 크기를 알고 싶다면 sizeof(x)

 

double의 크기를 알고 싶다면 sizeof(double)

 

이라 쓰면 됩니다.

 

그럼 그 크기를 한번 출력해보겠습니다.

 

 


정말 간단하죠? 이렇게 써서 표현해보니 int 자료형인 변수 x는 int형이니 크기가 당연히 4바이트며

 

int형은 4바이트니까 4 / double 형은 8바이트니까 8이라고 숫자를 띄워주네요.

 

 

-------------------------------------------------------------------------------------------

 

이것으로 변수와 자료형 첫번째 파트를 마치겠습니다.

 

되도록 쉽게 풀어 쓰려 했는데 쉬웠는지 잘 모르겠네요.

 

제가 쓴 글로 많은 도움이 되길 바랍니다.

 

혹여나 이 부분에 대해 이해안가는 것이 있다면 덧글로 달아주세요.

 

이것으로 포스팅 마치겠습니다. 


+ Recent posts