C언어의 자료형을 배워본다.
자료형은 무엇일까?
자료형을 논하기 전에 먼저 컴퓨터가 정보를 어떻게 다루는지 알아 봐야한다. 사람은 10진법에 익숙하지만 컴퓨터는 이진법으로 계산한다. 컴퓨터의 세계는 0과1로 이루어져 있다고 한다. 0과1로 된 자료형을 비트(bit)라 부른다.
0
1
쉽게말해 비트는 이 두개의 값 중 하나를 표현할 수 있다. 그럼 의문이 생긴다. 왜 0과1밖에 저장하지 못하냐? 2부터 9까지는 저장할수는 없는거냐? 그것은 컴퓨터에 정보를 저장하는 트랜지스터의 구조때문에 그렇다. 인류는 손가락을 하나씩 접으면서 10진법을 깨우쳤다. 수체계에서 다른 진법을 보다 10진법이 중심인 것은 매우 직관적이기 때문이다. 손가락을 접어가면서 수의 개념이 없는 아이에게도 가르쳐줄 수 있다.
왜 컴퓨터는 0과1밖에 표현하지 못하냐는 질문은, 왜 수학교과서는 10진법으로 쓰여져 있는가라는 물음과 같다.
트랜지스터에 대한 매우 멋진 설명이 있어서 아래에 링크한다.
https://javalab.org/transistor/
반도체의 개발자들이 마음만 먹으면 손가락이 10개인 컴퓨터도 만들어 낼 수 있을 것이다. 아래 그림처럼 전구를 하나의 트랜지스터라고 보면 트랜지스터 10개를 사용해서 만들 수 있을 것이다.
그러나 그것은 비효율적인 방법일 것이다. 과학자들은 1부터 10까지의 수를 저장하기 위해서 10개나 되는 트랜지스터를 사용하는 것과 같은 일은 하지 않는다. 트랜지스터를 10개는 이진법으로 2의10승(10비트) 1024개의 정수형을 저장이 가능하다. 아마 미래에 더 많은 수를 표현할 수 있는 회로가 나오기 전까지 컴퓨터는 0과1로 수를 세어야 할 것이다.
이진법에 대한 추가적인 내용은 아래 포스트를 참고할 수 있다.
https://digiconfactory.tistory.com/25
자 그럼 자료형을 왜 배우는지에 대해 이야기 해보자.
사람의 나이를 표현하기 위해서는 어떤 숫자가 필요할까? 사람은 보통 0세~100세 정도를 산다. 100년을 더 사시는 분들도 간혹 있는데 일반적인 경우 100세를 넘기기 어렵다. 그러면 100세를 표현하기 위한 컴퓨터의 저장공간이 필요하다. 숫자를 저장할 수 있는 공간이 메모리이다.
컴퓨터는 이진법을 사용하니까 대략 7비트를 사용하면 0부터 127까지의 수가 표현된다.
이진수: 0111 1111
십진수: 127
7비트를 사용하면 사람의 나이를 표현하는데 충분하겠다. 안전빵으로 8bit를 사용하면 아주아주 충분하다. 255살 까지 표현이 가능하니까 (255살은 현대 인류에겐 불가능하다.)
이렇게 8비트의 묶음을 1바이트라고 한다. 1바이트의 의미가 중요한데 컴퓨터의 메모리는 1바이트 단위로 되어 있다. C에서 1바이트의 자료형은 char 이다.
char라는 이름은 character (문자)의 약자인데 지금은 이름보다 실제 메모리에 어떻게 저장 되어있는가를 살펴본다.
0000 0000 부터
1111 1111 까지 사용
1바이트는 256가지의 경우를 표현할 수 있다. 양수만 따지면 0~255까지, 음수를 사용하면 -128 ~ 127 까지가 된다. (128 + 1(0의 경우) + 127 = 256개, 0도 카운트해야한다)
C언어에서는 양수만 사용하는 경우와 음수까지 사용하는 경우 자료형을 지정할 수 있다.
#include <stdio.h>
int main(void){
unsigned char ch1;
ch1 = 255;
signed char ch2;
ch2 = -128;
char ch3;
ch3 = 127; // 그냥 char는 signed char이다.
printf("unsigned char : %d\n",ch1);
printf("signed char : %d\n",ch2);
printf("char : %d\n",ch3);
}
main함수 다음 첫번째 줄에서 unsigned char형 변수 ch1을 선언했다. 부호가 없는 (unsigned) 1바이트 변수이다. 범위는 0부터 255까지이다. 부호는 - 를 말한다.
두번째는 signed char형 변수 ch2를 선언했다. 부호가 있는 (signed) 1바이트 변수이다. 범위는 -128부터 127까지이다.
세번째는 그냥 char형 변수 ch3을 선언했다. 아무것도 앞에 쓰지 않으면 컴파일러가 자동으로 signed 로 선언한다.
C의 소스코드를 처음 보면 저 짧은 코드에도 이해가 안되는 부분이 많다. 첫줄 #include부터 의문일 것이다. C를 이해하려면 시간이 필요하다. 지금은 자료형에 대해서 알아보는 시간으로 생각하자. 차근차근 학습하다보면 하나씩 의문이 풀리기 시작할 것이다.
* 변수에 대해서는 자료형과 함께 약간의 설명이 필요하다.
프로그래머가 C언어로 사람의 나이를 표현해야 한다면 unsigned char를 사용해야 할 것이다. 일단 0부터 255살까지 저장할 수 있다. 만약 7비트를 써서 127세까지 충분히 사용할 수 있다고 생각해도 메모리 주소의 최소 단위는 1바이트기 때문에 8비트를 사용해야 한다.
그러면 나이를 적을 메모리의 공간을 확보하였다. 그 다음은 이 공간에 접근하기 위한 수단이 필요하다. 이 때 변수가 등장한다. ch1, ch2, ch3 는 각자 다른 메모리의 주소에 저장된다. 프로그래머는 변수라는 이름을 불러내서 그 주소에 있는 값을 가져올 수 있고 변경할 수 있다. 변경할 수 있는 수라고 해서 변수라고 한다. (variable)
변수를 상자라고 생각해도 된다. 상자의 크기가 자료형의 크기이다. C언어 중반부에 만나는 포인터는 이 상자 개념의 확장이다. 많은 사람들이 포인터 챕터에 가서 C를 그만둔다고 한다. C언어는 다른 언어와 달리 개념의 이해와 실습을 동시에 진행해야 하는 언어라 하나를 배우더라도 깊이있는 학습이 필요하다. 그렇지 않으면 시간의 문제일 뿐 어느 시점에 가면 한계가 온다.
그럼 C는 그냥 어렵기만 한 것일까? 학습과정이 험난한 만큼 극복후에 얻는 것도 많다. 현대문명의 이기들에 C는 수많은 기여를 했다. 인터넷에 조금만 검색해 봐도 C언어의 파워를 느낄 수 있을 것이다.
char형의 대해서 마무리를 한다. 사실 char형은 문자를 표현하는 변수인데 문자의 표현에 대하여는 별도의 포스트를 작성할 것이다.