앞서 작성했던 간단한 프로그램은 단순히 출력을 하기 때문에 데이터를 어딘가에 저장할 필요가 없었습니다. 하지만 이후 배울 키보드 입력 함수를 이용하다 보면 데이터를 어디에 저장하고 사용해야 할 필요가 생기게 됩니다. 모든 프로그래밍 언어에서는 이를 위한 변수 기능을 제공하는데요, 이러한 변수 기능을 이용하면 컴퓨터의 메모리에 특정 크기의 공간을 마련해 자료를 저장할 수 있습니다.
프로그램은 실행되기 전에는 보조 기억장치(HDD, SSD)에 저장되어 있다가 실행하게 되면 함수와 변수가 메모리(RAM)에 적재됩니다.
여기서 변수가 저장되는 공간의 크기에 따라 들어갈 수 있는 데이터의 범위가 달라지게 되는데요, 이처럼 변수에 저장되는 데이터의 종류를 자료형이라 합니다. C언어에서 사용되는 자료형의 종류는 크게 정수형, 실수형 두 종류가 있으며 같은 정수형이라 하더라도 표현할 수 있는 수의 범위(공간의 크기)에 따라 세분화된 여러 종류가 있습니다.
큰 수를 표현할 필요가 없는데 변수에 메모리를 많이 할당(=공간을 크게 설정=저장할 수 있는 수위 범위가 크게)하는 것은 낭비이겠죠? 따라서 변수를 사용하려는 목적에 알맞게 자료형을 선택하는것이 좋습니다.
정수형(Integer)
정수형은 소숫점이 없는 숫자를 의미합니다.
•
char : character의 약자로, 주로 문자 하나를 저장하기 위해 사용, 1 byte (8 bit)
프로그래밍 언어에서 문자는 일반적으로 ASCII 코드로 표현합니다. 이때 ASCII코드의 총 가지수가 128개이기 때문에 -128~127까지 양수 범위에서 128개의 표현 범위를 가지는 char형을 문자 표현에 사용합니다.
만약 영문자 a를 C언어에서 표현하기 위해서는 ASCII코드 상의 영문자 a의 값인 97을, 문자 0을 표현하기 위해서는 48을 입력합니다.
•
short : int와 char 사이 크기의 변수. 2 byte (16 bit)
•
int : integer의 약자로, 정수 형태의 자료형이 필요하다면 주로 사용 4 byte (32 bit)
•
long: int보다 컸던 자료형으로, 64bit OS에서는 int와 동일한 4 byte (32 bit)공간을 가짐
•
long long : int, long보다 큰 자료형으로, 8 byte (64 bit)공간을 가짐
int와 long이 같은 크기를 가지는 이유는 PC의 발전으로 C언어가 개발될 당시의 PC 성능과 현재의 PC 성능이 다르기 때문입니다. 시스템마다 같은 이름의 자료형이라 하더라도 다른 표현 범위를 가질 수 있어 C99라는 표준에서는 stdint.h의 자료형을 권장합니다.
자료형 | 크기 | 범위 |
int8_t | 1 byte | -128 ~ 127 |
uint8_t | 1 byte | 0 ~ 255 |
int16_t | 2 byte | -32,768 ~ 32,767 |
uint16_t | 2 byte | 0 ~ 65,535 |
int32_t | 4 byte | -2,147,483,648 ~ 2,147,483,647 |
uint32_t | 4 byte | 0 ~ 4,294,967,295 |
int64_t | 8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
uint64_t | 8 byte | 0 ~ 18,446,744,073,709,551,615 |
여기서 노란색으로 표시한 부분은 각 자료형의 크기를 의미합니다. 자료형의 크기 만큼 메모리에 공간을 할당받게 되고 그 공간의 각 비트를 켜고 꺼(2진법) 숫자를 표현합니다. 예를 들어 1 byte의 크기를 가지는 char형은 1 byte = 1*8 bit이기 때문에 8개의 비트가 있으며, 이 8개의 비트를 2진법으로 켜고 끈다면 0~2^8-1 = 0~255까지 총 256 단계를 표현할 수 있습니다. 이것을 음수의 범위를 표현하기 위해 반으로 잘라 -128~127까지 표현하도록 하는 것입니다.
여기서 음수가 하나 더 많은 이유는 PC에서 음수의 표현을 위해 2의 보수법을 사용하여 0이 양수로 취급되기 때문입니다.
만약 1의 보수법을 사용했으면 범위는 깔끔하겠지만, 음수 0과 양수 0이 생겨 혼란이 생기겠죠? PC에서 굳이 2의 보수법을 이용하는 이유는 이러합니다.
따라서 정수형의 표현 범위를 계산해 정리하면 아래와 같습니다.
자료형 | 크기 (byte) | 표현 범위 |
char | 1 | -128 ~ 127 |
short | 2 | -32,768 ~ 32,767 |
int | 4 | -2,147,483,648 ~ 2,147,483,647 |
long | 4 | -2,147,483,648 ~ 2,147,483,647 |
long long | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
그런데 막상 프로그램을 작성하다 보면 음수를 다룰 일이 그렇게 많지는 않습니다. 이러한 이유로 만약 양수의 범위만 사용하고 싶다면 unsigned 키워드를 자료형 이름 앞에 붙여 양수 표현 범위를 2배로 늘릴 수 있습니다. 즉, unsigned char형은 0~255까지 표현할 수 있는것이죠.
이를 다시 표로 정리하면 아래와 같습니다.
자료형 | 크기 (byte) | 표현 범위 |
unsigned char | 1 | 0 ~ 255 |
unsigned short | 2 | 0 ~ 65,535 |
unsigned int | 4 | 0 ~ 4,294,967,295 |
unsigned long | 4 | 0 ~ 4,294,967,295 |
unsigned long long | 8 | 0 ~ 18,446,744,073,709,551,615 |
실수형(Floating point)
정수형이 있으니 실수, 즉 소숫점을 나타낼 수 있는 자료형도 있겠죠? C에서는 float, double, long double 3 가지의 실수 자료형을 지원합니다.
•
float : 컴퓨터에서 실수를 표현하는 방식인 Floating-point arithmetic(부동소수점)의 약자로, 주로 소수점 이하 6자리까지 표현이 가능함. 4 byte (32 bit)
•
double : float보다 더 큰 범위를 표현할 수 있는 자료형. 15자리까지 유효함. 8 byte(64 bit)
•
long double : double보다 더 큰 범위를 표현할 수 있는 자료형. 15자리 이상 유효함. 10 byte (80 bit)
실수형의 정밀도 및 차지 메모리 크기는 시스템마다 다를 수 있습니다.
실수형은 정수형과는 다르게 소수점 이하의 값을 표현하기 위해 부동소수점 방식을 사용합니다.
여기서 부동소수점 방식이란 가수부와 지수부를 나누어 실수를 근사적으로 표현하는 방법입니다. 예를 들어 3.4*10*38이라는 숫자가 있다면 3.4가 가수, 38이 지수에 해당하는데, float형은 가수부에 23비트를, 지수부에 8비트를 할당합니다. 이러한 이유로 같은 4바이트를 사용하는 int에 비해 말도안되는 큰 숫자를 표현할 수는 있지만 항상 오차가 발생합니다.
예를 들어 float의 표현범위는 다음과 같습니다. (-3.4E+38 ~ 3.4E+38)
-3,400,000,000,000,000,000,000,000,000,000 ~ 3,400,000,000,000,000,000,000,000,000,000
자료형 | 크기 | 범위 | 정밀도 |
float | 4 byte | -3.4E+38 ~ 3.4E+38 | 6자리 |
double | 8 byte | -1.7E+308 ~ 1.7E+308 | 15자리 |
long double | 16 byte | -1.1E+4932 ~ 1.1E+4932 | 19자리 |
논리형 (Boolean)
논리형은 참과 거짓을 표현하는 1byte짜리 자료형입니다. 사실 참과 거짓을 저장하는 용도로는 char형을 사용하여도 무방하지만 조금 더 의미를 명확히 하기 위해 bool형을 사용하는것을 권장합니다.
•
bool : 참과 거짓의 두 가지 상태를 표현. 1 byte (8 bit)
끄고 켜는 하나의 상태(1 bit) 만을 표현하지만 1 byte를 차지하는 이유는 메모리 블럭의 단위가 1 byte이기 때문입니다. 메모리에 대한 자세한 내용은 뒤에서 설명합니다.
교과서에는 bool형에 대한 언급이 없는데요, C99라고 부르는 ISO/IEC 9899:1999 표준에서 만들어진 비교적…최신 자료형이기 때문입니다.
이때문에 C언어에서 bool형을 사용하기 위해서는 stdbool.h를 include해야 합니다.
표준을 보면 1999이라고 되어 있죠? 네, 맞습니다. bool형은 20년 전에 만들어진 표준입니다.