본문 바로가기
  • 오늘도 신나게
코딩을 합시다/최대한 쉽게 설명한 C 언어

초등학생도 이해하는 C 언어 - 변수와 자료형

by 앵그리선반장 2020. 4. 30.

변수 (Variable) 는 어떤 값을 넣을 임의의 저장소입니다.

저장소라고 하니 좀 어렵게 느껴지는데요.

사용하기 위해서는 미리 다음과 같이 선언을 해야 합니다.

int a, b, c;

a, b, c 라는 세 개의 변수를 사용하겠다고 미리 선언한 것입니다.

 

이 것은 다음과 같이 써도 동일합니다.

int a; 
int b; 
int c; 

왜 선언을 해야 할까요? 

컴퓨터 시스템에서 구동되는 모든 것들은 메모리에서 처리됩니다.

a = 1;

위 코드는 a 라는 저장 공간에 1 이라는 숫자를 넣으라는 명령입니다.

그런데 만약 a 라는 저장 공간이 없다면 1 을 넣을 공간이 없다는 것이겠지요.

따라서 a 에 1 을 넣기 위해서는 먼저 a 라는 저장 공간을 마련 해야 합니다. 

그것이 바로 선언이며, 시스템의 메모리 공간에 a 라는 변수의 공간을 마련하는 것을 말합니다.

만약 지금 글을 읽고 계신분 중 공간이라는 말을 보고 얼마나 큰 공간?이라는 의문이 들었다면 당신은 시스템 프로그램에 소질이 있는 분입니다. ~ 

선언할 때 앞에 붙은 int 라는 것이 그 공간의 크기를 말합니다.

그 크기의 종류들을 다 모아서 자료형이라고 하고요.

int 는 integer 의 약자로 4바이트 정수형입니다.  (1 바이트는 8비트 )

int 로 선언된 변수는 4바이트 (32비트) 의 저장 공간을 할당받습니다.

32 비트로 표현할 수 있는 숫자는 2의 32승 가지 입니다. 

실제 표현이 가능한 숫자는 -2,147,483,648 ~ +2,147,483,647 까지 입니다.

응? 음수? 

네 맞아요 0을 중심으로 음수와 양수까지의 범위중 32비트로 표현 가능한 숫자입니다.

만약 int 앞에 unsigned (부호가 없는)  를 붙여 다음과 같이 선언할 수 있습니다.

unsigned int a; 


이것은 부호가 없는 4byte 정수를 뜻합니다.

실제로 메모리에서 저장되는 용량은 32비트(4byte) 로 동일 하지만 숫자로 표현을 할 때는 

0 부터 4,294,967,295 까지 이며, 부호가 있는 int 형으로 선언할 때 보다 양수의 크기가 두배로 늘어나게 됩니다. 

대신 음수부는 표현할 수 없습니다.

따라서 사용자는 내가 계산하고자 하는 숫자의 범위나 크기에 맞게 자료형을 선택해 주어야 합니다.

예를 들어 다음 코드는 변수 c 의 자료형이 잘못 선택된 것입니다.

int a,b; 
short c; 

a = 35000; 
b = 16000; 
c = a+b; 


코드에서 a 와 b 는 부호가 있는 4바이트 정수형인 int 형으로 선언되었습니다.

( unsighed 를 붙이지 않으면 기본으로 부호가 있는 형태로 선언됨)

그리고 그 값으로 35,000 과 16,000 이 넣어졌기 때문에 공간이 충분하므로 문제가 되지 않습니다.

하지만 c 는 short 형으로 선언되었으며, short 은 2byte (16bit) 정수 형이며 -32,768 ~ +32,768 까지의 정수만 저장할 수 있는 공간 인데 a+b 의 값인 51,000 을 넣으려고 했으므로 그 크기가 더커 저장 할수 없게 됩니다.

따라서 이 코드는 에러를 발생하거나 잘못된 값을 저장하게 됩니다. 

하지만 만약 short 앞에 unsigned 붙여 unsigned short c 라고 선언을 했다면, 0 ~ 65,535 까지 표현이 가능하므로 51,000 을 저장할 수 있게 되므로 문제가 없는 코드가 됩니다.

이처럼 자료형은 사용할 변수의 크기와 타입을 미리 시스템에 알려 그 공간을 확보하는 기능을 합니다.

자료형은 크게 정수형, 실수형, 문자형 이 있습니다.

정수는 말 그대로 소수점 이하의 값이 없는 정수를 저장하기 위한 변수이고, 실수는 소숫점 이하의 값이 있는 숫자입니다.

문자형은 숫자가 아닌 A,S,Z 와 같은 문자를 저장하기 위한 변수입니다.

정수형

정수 타입 할당되는 메모리 사이즈 데이터 표현 가능 범위
(signed) short 2 바이트 - 32,768 ~ 32,767
unsigned short 2 바이트 - 0 ~ 65,535
(signed) int 4 바이트 - 2,147,483,648 ~ 2,147,483,647
unsigned int 4 바이트 - 0 ~ 4,294,967,296
(signed) long 4 바이트 - 2,147,483,648 ~ 2,147,483,647
unsigned long 4 바이트 - 0 ~ 4,294,967,296

 

실수형

실수 타입 할당되는 메모리 사이즈 데이터 표현 가능 범위
float 4 바이트 3.4 X 10-38) ~ (3.4 X 1038)
double 8 바이트 (1.7 X 10-308) ~ (1.7 X 10308)
long double double형과 동일함. double형과 동일함.

 

문자형

실수 타입 할당되는 메모리 사이즈 데이터 표현 가능 범위
(signed) char 1 바이트 -128 ~ 128
unsigned char 2 바이트 0 ~ 256

요즘은 하드웨어 사양들이 좋아져서 저장 메모리의 공간들을 크게 고려하지 않는 개발자들이 있는데요.

저사양 임베디드 시스템에서는 메모리 용량을 줄이기 위해 가장 작은 자료형인 char 를 많이 사용합니다.

256 이라는 값 이하로 계산이 되는 변수를 int 와 같은 4바이트 타입으로 선언해서 쓴다면 너무나 큰 메모리의 낭비가 발생하기 때문이지요.

이런 것들이 바로 시스템 최적화의 일부입니다.

사실 저사양 임베디드 시스템에서는 2byte 이상의 데이터 값을 갖는 경우는 그다지 많지 않아서 대부분 unsigned char 타입의 자료형을 많이 씁니다.

char 가 문자형이라고는 하지만 실제로는 8비트로 표현되는 모든 것을 저장할 수 있습니다.

댓글