1. 자료형이란?
C언어에서 자료형이란 데이터를 표현하는 기준이자 방법입니다. 변수, 상수 등이 자료형에 근거하며 자료형은 변수선언에 사용될 수 있습니다. 앞 포스팅에서 num이란 이름의 변수(데이터의 저장을 위해서 할당된 메모리 공간에 붙여진 이름)를 선언할 때 정수의 저장이 가능한 메모리 공간을 할당하기위해 int를 사용했습니다. 여기서 int는 어떤 데이터를 어떻게 표현할지 정하였으므로 자료형, 그 중에서도 정수형이라고 부를 수 있습니다. 즉 int는 어떤 내용을 저장할지(정수? 실수? 등)와 얼만큼의 바이트를 사용할지(4바이트? 8바이트? 등)를 결정했습니다(정수, 4바이트로). 이러한 자료형은 미리 정의되어 있기 때문에 우리는 자료형의 이름을 이용해서 쉽게 메모리 공간을 할당할 수 있습니다.
2. 기본 자료형
다음은 C언어에서 기본적으로 제공하는 기본 자료형입니다. 크게 정수형과 실수형으로 나눌 수 있습니다.
자료형 | 크기 | 값의 표현범위 |
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 |
float | 4바이트 | ±3.4x10^-37 ~ ±3.4x10^+38 |
double | 8바이트 | ±1.7x10^-307 ~ ±1.7x10^+308 |
long double | 8바이트 이상 | double 이상의 표현범위 |
위 표에서 자료형 char(character의 줄임말)을 대표로 살펴보자면, char는 1바이트(8비트)이므로 나타낼 수 있는 데이터의 종류는 \(2^{8}=256\)개입니다. 따라서 -128부터 +127까지 표현하도록 정의하였습니다. 이렇게 여러 자료형이 있는 이유는 첫째, 데이터의 표현방식이 다르므로 최소 둘 이상의 자료형이 필요하기 때문입니다. 즉 자료형의 종류는 크게 정수 자료형과 실수 자료형으로 나뉩니다. 이렇게 나눈 이유는 이전 포스팅에서 다뤘듯이 컴퓨터가 정수와 실수를 표현하는 방식이 다르기 때문입니다. 둘째로 메모리 공간을 효율적으로 사용하기위함입니다. 정수 2를 표현하기위하여 int를 사요하는 것보다 char를 사용하는 것이 크기상으로 보았을 때 더 효율적일 것입니다.
사실 C언어의 자료형 별 크기는 정확히 제한되어 있지는 않고 컴파일러마다 조금씩 차이를 보입니다.(그 차이의 정도는 크지 않습니다.) 그렇다면 자료형의 크기는 어떻게 확인할 수 있을까요? C언어에서는 메모리 공간에서 소모하는 메모리의 크기를 바이트 단위로 계산해서 반환하는 sizeof라는 연산자가 존재합니다. 다음은 제가 사용하는 컴파일러에서의 자료형 별 바이트 크기를 확인한 예제입니다. 연산자 sizeof를 사용한 것에 주목해주세요.
일반적으로 CPU가 처리하기에 가장 적합한 크기의 정수 자료형을 int로 정의합니다. 따라서 int형 연산의 속도가 다른 자료형의 연산속도에 비해서 동일하거나 빠릅니다. 보통 char형 변수와 short형 변수는 데이터의 양이 많아서 연산속도보다 데이터의 크기를 줄이는 것이 더 중요한 데이트들(MP3나 MP4)에 사용됩니다.
3. 정수 자료형의 unsigned와 실수 자료형의 정밀도
정수 자료형에 한해서 unsigned 선언을 추가하면, 0 이상의 값만 표현하는 자료형이 되어서 같은 바이트여도 표현할 수 있는 값의 범위가 2배가 됩니다. 이것이 가능한 이유는 부호를 나타내는 MSB조차 값의 크기를 나타내는 비트로 사용되기 때문입니다. 따라서 그 크기와 값의 표현범위는 아래와 같습니다.
정수 자료형 | 크기 | 값의 표현범위 |
char | 1바이트 | -128 ~ +127 |
unsinged char | 1바이트 | 0 ~ +255 |
short | 2바이트 | -32,768 ~ +32,767 |
unsinged short | 2바이트 | 0 ~ +65,535 |
int, long | 4바이트 | -2,147,483,648 ~ +2,147,483,647 |
unsigned int, unsigned long | 4바이트 | 0 ~ +4,294,967,295 |
long long | 8바이트 | -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807 |
unsigned long long | 8바이트 | 0 ~ +18,446,744,073,709,551,615 |
또한 위 표에서 실수 자료형이 표현할 수 있는 값의 범위는 매우 넓은 것을 볼 수 있습니다. 따라서 실수 자료형에서 정말 중요한 요소는 정밀도가 됩니다. 여기서 말하는 정밀도는 오차가 발생하지 않는 소수점 이하의 자릿수를 뜻합니다. 연산이 거듭될 수록 적은 오차가 큰 오차를 발생시킬수도 있으니 정밀도를 선택하는 것은 중요합니다. 정수 자료형에서 int를 보편적으로 선택하듯이 실수 자료형에서는 double형을 보편적으로 선택합니다.
실수 자료형 | 소수점 이하 정밀도 | 바이트 수 |
float | 6자리 | 4 |
double | 15자리 | 8 |
long double | 18자리 | 12 |
double형의 경우, 소수점 이하 15자리까지는 오차가 발생하지 않음을 보장합니다.
4. 문자형
컴퓨터는 숫자를 이용해서 무언가를 인식하고 표현하므로 문자 역시 숫자를 이용해서 표현해야합니다. 숫자를 문자에 연결하는 코드를 아스키(ASCII) 코드라고 합니다. 아스키 코드는 알파벳과 일부 특수문자를 포함하여 총 128개의 문자로 이루어져 있으며 다음 사이트에서 자세히 확인 가능합니다.
https://ko.wikipedia.org/wiki/ASCII
참고로 예제를 위해 몇몇 아스키 코드와 아스키 코드에 할당된 아스키 코드 값을 정리하면 다음과 같습니다.
아스키 코드 | 아스키 코드 값 |
A | 65 |
B | 66 |
C | 67 |
' | 96 |
~ | 126 |
프로그램상에서의 문자표현에는 작은 따옴표( ' ' )가 사용됩니다. 컴파일러는 이렇게 표현된 문자를 컴퓨터가 인식할 수 있도록 숫자로 바꿔버립니다.
위 예제를 통해 정수와 문자는 출력 방법에 따라서 문자의 형태로도, 숫자의 형태로도 출력이 가능하다는 것을 알 수 있습니다. 아스키 코드 값은 0이상 127이하로 이루어져있으므로 int형 변수보다 char형 변수로 저장하는 것이 메모리를 효율적으로 사용하게 될 것입니다. 조금 더 자세히 설명하자면 char형은 문자의 표현을 위해서 정의된 정수자료형입니다. 그래서 이름도 character의 줄임말로 정해진 것입니다. (int형은 char형에 비해 정수의 '연산'에 있어서 더 빠르므로 문자를 저장하는 데에는 int형 변수보다 char형 변수가 더 적합합니다.)
또한 다음과 같이 사용자로부터 아스키 코드 값을 정수의 형태로 입력 받은 후 해당 정수의 아스키 코드 문자를 출력하는 프로그램을 작성할 수도 있습니다.
그 역도 가능합니다.
참고자료 : 윤성우, 「열혈 C프로그래밍」, ORANGE MEDIA, 2013
'프로그래밍 > C 언어 기초' 카테고리의 다른 글
6. C 기본 자료형 이해하기2(상수, 자료형의 변환) (0) | 2021.09.24 |
---|---|
4. C 비트연산자(연산자 &, |, ^, ~, <<, >>, and, or, xor, 비트 반전, 비트 이동) (2) | 2021.09.24 |
3. C 데이터 표현방식 이해하기1 (2진수, 10진수, 16진수, 2진수 10진수구하기, 비트, 바이트) (0) | 2021.08.05 |
2. C 연산자와 변수 (C변수선언, C연산자, C 수학연산, C 산술, C산수, 비교, 논리, and, or) (0) | 2021.07.26 |
1. C언어의 기본 (C언어 시작하기, C파일생성, 소스코드, C기본코드, C언어 함수, C주석) (0) | 2021.07.20 |