프로그래밍 언어/C

자료형(Data Types)

gcreators 2024. 8. 7. 17:19

지난 변수에 이어서 작성합니다

 

자료형(Data Types) 이란?

 

저장되는 데이터의 종류에 따른 형태로, 저장되는 값의 종류와 범위에 따라 다양하게 표현 됩니다.

 

변수를 선언할 때는 기본적으로

 

자료형 변수명 = 초기값; 의 형태를 띄게 됩니다.

(초기값은 생략이 가능하며 언제든 변수에 들어갈 값(데이터)을 지정 할 수 있습니다)

 

정수는 short, int, long

실수는 float, double

문자는 char

 

등 다양한 자료형이 존재합니다.

변수를 선언 해보겠습니다.

char c = 'a';

short s = 1;

int i = 10;

long l = 100L;

long long int ll = 1000LL;

 

그러면 메모리에는 이런 형식으로 데이터가 할당 됩니다.

(가시성을 위해 이진법으로 표현하지 않았습니다.)

1              
               
      10        
               
          100    
               
  a            
            1000  

 

저렇게 할당 된 데이터는

각 데이터를 할당할때 붙인 변수명을 호출하면 해당 데이터를 호출 할 수 있습니다.

char c = 'a';
printf("C: %c\n", c);

short s = 1;
printf("s: %i\n", s);

int i = 10;
printf("i: %d\n", i);

long l = 100L;
printf("l: %li\n", l);

long long int ll = 1000LL;
printf("ll: %lli\n", ll);

 

해당 코드를 실행하면

 

다음과 같이 변수를 호출하여 값(Data)을 확인 할 수 있습니다.

데이터는 여러 종류가 있듯이 이를 담아내는 자료형에도 여러 종류가 있고

이를 화면에 표시하기 위해 사용되는 format specifier(형식 지정자)도 있습니다.

모두 설명 할 수는 없으니 필요한 것들은 여기서 확인 해보도록 합시다.

 

그럼 이제 주로 사용되는 자료형들을 확인 해보겠습니다.

 

문자형

char

 

풀네임은 Character, 약어로 char를 사용합니다.

 

1byte의 크기를 가지고 있습니다. (1byte = 8bit)

1byte는 0-255, 256개의 값을 담아낼 수 있는 크기입니다

 

자 그런데 분명 이진수로 저장되는 메모리에 문자는 어떤식으로 저장이 될까요?

정답은 이 역시도 숫자입니다.

컴퓨터는 문자를 모릅니다, 저장된 숫자에 대응하는 그림(문자)을 준비하고 숫자에 해당하는 그림을 표시하는 것이죠

char c = 'a';
printf("C: %d\n", c);

형식 지정자를 정수를 출력해주는 %d로 변수 c를 호출해보겠습니다.

 

97이라는 숫자를 문자로 출력한다면 a라는 문자가 출력되게 되는 것 입니다.

 

이는 

int i = 97;
printf("i: %c\n", i);

정수형으로 선언한 변수 97을 문자형으로 출력해도 같은 결과가 나오게 됩니다.

 

이는 구글에 ascii code table 을 검색해서 확인해보면 더 상세히 알 수 있습니다.

현대에는 아스키 코드가 아닌 유니코드를 더 많이 사용합니다. 이는 다음에 상세하게 다뤄보도록 하겠습니다.

 

다시 본문으로 돌아와서

char c = 'a';
//char 변수명 = 값('문자' or 숫자) *값에는 산술 연산이 가능하다 98-1 or 'b'-1 -> 97인 소문자 a가 나오게 됨
printf("C: %c (%p) [%d byte]\n", c, &c, sizeof(char));

다음 코드를 실행하게 되면

 

이런 결과가 나오게 됩니다

순서대로 변수 C에 담긴 데이터 값인 a

그리고 그 변수 C가 가리키고 있는 메모리 주소 값(16진수로 구성되어 있습니다.)

마지막으로 char형의 크기 1byte를 뜻합니다

 

보시는 바와 같이 메모리 주소값은 직접 확인하는 것이 아닌 이상 이를 기억해두고 호출 할 수 있는 것이 아니기에

우리는 변수를 선언하여 메모리에 공간을 할당하고 변수명을 통해 그 메모리에 있는 값을 활용하는 것 입니다.

 

이제 정수형 입니다

short s = 1;
//풀네임 Short Integer
printf("s: %i (%p) [%d byte]\n", s, &s, sizeof(short));
//i는 Integer를 의미합니다

int i = 10;
//풀네임 Integer
printf("i: %d (%p) [%d byte]\n", i, &i, sizeof(int));
//d는 Decimal(10진수)를 의미합니다.

long l = 100L;
//풀네임Long Integer
printf("l: %li (%p) [%d byte]\n", l, &l, sizeof(long));

long long int ll = 1000LL;
printf("ll: %lli (%p) [%d byte]\n", ll, &ll, sizeof(long long int));

 

내가 사용할 데이터가 어느정도 크기인지를 가늠하고 목적에 맞는 정수형의 사용이 필요합니다.

 

여기서 주의깊게 볼 점은

int와 long의 크기가 4byte로 같다는 점 입니다.

 

왜냐하면 int라는 정수형의 특수성이 있기 때문입니다.

int 는

가장 효율적으로 처리될 수 있는 정수타입 이라는 의미로 개발된 타입이며,

연산의 기본 단위로 컴퓨터에서 가장 빠르게 연산됩니다.

 

따라서 속도가 중요한 작업에는 int형을 사용하는 것이 좋겠죠

 

또한 int 는 cpu가 데이터를 처리하는 단위와 동일한 크기를 가집니다.

 

다만 요즘 사용되는 운영체제는 64bit 운영체제를 가지고 있습니다. 즉 8byte가 되죠

 

그런데 왜 4byte로 표시될까요? 바로 현재 개발을 위해 제가 사용중인 프로그램이 32bit까지만 지원하기 때문입니다(...)

64bit로 바꿀 수 있으면 바꾸는게 좋을거 같네요

 

아무튼 cpu의 데이터 처리 단위와 동일한 크기를 가지는 int의 특성상

과거 16bit의 운영체제에서는 2byte의 크기를 가졌다고도 하네요.

 

여러분이나 제가 앞으로 개발하게 되는 환경이

cpu가 빠른 환경인지 메모리가 널널한 환경인지 모르니 이에 맞게 정수형들을 활용해 개발을 해나가야 할거 같습니다

 

실수형

 

float f = 3.1f;
printf("f: %f (%p) [%d byte]\n", f, &f, sizeof(float));


// Double Precision Floating-Point((두)배 정밀도 부동소수점)
double d = 3.14;
printf("d: %lf (%p) [%d byte]\n", d, &d, sizeof(double));

long double ld = 3.144L;
printf("ld : %Lf (%p) [%d byte]\n", ld, &ld, sizeof(long double));
	
float result = 0.0f;
for (int i = 0; i < 1000; ++i)
{
	result += 0.001f;
}
printf("result: %f\n", result); //1이 나와야 하는데 나오지 않음, 이를 부동소수점 오차(오류) 라고 함

 

float형은 4byte의 크기를 가집니다.

주의할 점이 있는데 3.1f에서 f를 생략하면 double (8byte) 로 계산이 됩니다.
따라서 4byte인 float형에서는 8byte가 되어버린 데이터 값을 온전히 담아낼 수 없으므로 데이터 손실이 일어나게 되므로
용량 관리를 위해 자료형을 만들었으니 자료형에 맞는 데이터를 넣어야 하겠습니다.

'프로그래밍 언어 > C' 카테고리의 다른 글

변수(Variables)  (0) 2024.08.08
컴퓨터의 음수와 MSB / LSB  (0) 2024.08.07
프로그램 - 메모리 할당  (0) 2024.08.07
C언어) 소스 파일과 헤더 파일  (0) 2024.08.06
함수(Functions) _ feat. 전처리기  (0) 2024.08.06