자료형을 소프트웨어를 다루는 가장 기본이다. 자료형은 컴퓨터 코드를 사용하여 조작하려는 그 자체이다.

 

크고 복잡한 프로그램의 구성은 작은 데이터 조각들이 수만개, 수십억개 모여서 상호작용 하여 이루어지는 것이다.

 

마치 인간 세상에 개인들이 모여서 거대한 사회를 이루는 모습과도 비슷하다.

 

프로그래머는 컴퓨터의 기본 단위인 변수에 대하여 완전한 이해를 해야 하며,

 

변수를 선언하기 전에 어떤 데이터 타입을 사용할 것인지 결정을 해 두어야 한다.

 

 

최근 인기가 많은 언어들 중에는 파이썬 처럼 인터프리터가 자동으로 변수의 타입을 결정하는 언어도 있다.

 

그런 언어는 자료형에 유연(flexible)하다고 한다. 반면 C++ 은 자료형에 엄격한 (strict) 언어이다.

 

변수를 선언하고 사용할 때 항상 자료형에 대한 고민을 해야 한다. 이는 단점이 아니라 언어마다 장단점이 있다.

 

장단점에 대하여 잘 알기 위해서는 직접 프로그래밍을 해보는 것이 최선이다.

 

C++의 타입

 

C++에는 데이터 타입이 여러가지가 있다.

 

크게 분류하면 

  • 불형, 캐릭터형(문자형),정수형,부동소수형

이 네가지로 나눌 수 있다.

 

*MSDN C++ 자료형 항목 링크

https://docs.microsoft.com/ko-kr/cpp/cpp/fundamental-types-cpp?view=vs-2019

 

자료형

용량

분류

bool

1바이트

불형

char

1바이트

 

문자형

wchar_t

2바이트

short

2바이트

 

 

정수형

int

4바이트

long

4바이트

float

4바이트

실수형

double

8바이트

long double

16바이트

#include <iostream>
#include <climits>


using namespace std;
void line();


int main()
{
        cout << "Basic data type C++" << endl;
        line();
        cout << "bool size  : " << sizeof(bool)  << " byte\n";


        cout << "char size        : " << sizeof(char)  << " byte\n";
        cout << "wchar_t size  : " << sizeof(wchar_t)  << " byte\n";
        cout << "short size       : " << sizeof(short) << " byte\n";
        cout << "int size           : " << sizeof(int)     << " byte\n";
        cout << "long size        : " << sizeof(long)   << " byte\n";


        cout << "float size      : " << sizeof(float)      << " byte\n";
        cout << "double size  : " << sizeof(double)   << " byte\n";
        cout << "long double size  : " << sizeof(long double)   << " byte\n";


    return 0;
}
void line(){
        cout << "=======================" << endl;
}

예제 코드는 기본 데이터 타입의 사이즈를 출력한다. 시스템 마다 약간의 차이가 있을 수 있다. 윈도우10에서 64비트 GCC 컴파일러로 출력해봤다.

 

C++의 데이터 타입은 자바,C 등의 언어에서도 거의 비슷하므로 하나의 언어에서 기본 개념을 잘 잡으면 다른 언어를 배울 때 수월하다.

 

CPU가 메모리에 접근하는 기본 단위가 1바이트 이므로 거의 대부분의 언어가 비슷하다는 사실을 염두해 둔다.

 

불형은 참,거짓의 두가지 경우만 있기 때문에 0과1 즉 1비트만으로도 가능할 것 같은데 굳이 8비트(1바이트)를 쓰는 이유는 CPU 의 손이 8비트 이기 때문이다.

 

1비트만 사용하면 공간과 시간을 절약할 수 있을 것 같지만 컴퓨터는 그렇게 동작하지 않는다.

 

*자료형은 1바이트 단위로 표기한다.

 

바이트의 크기가 곧 자료형의 크기의 차이를 말한다. 10진 정수만 사용하던 사람들은 2진수 표현 방식에 익숙하지 않을 것이다.

 

당연한 것이니 암산이 빨리 안되도 낙심할 필요는 없다.

 

잘 안외워니까 4바이트 정도까지의 크기를 러프하게 기억해 두면 좋다.

 

1바이트는 256개, 2바이트는 65000개, 4바이트는 42억까지의 숫자범위를 표현가능하다.

 

여기서 숫자범위라고 한 것에 주의할 필요가 있다. 4바이트에는 42억개를 저장하는게 아니라 42억개의 숫자 범위를 표현할 수 있다. 

 

즉 int 라는 부호없는 정수형 자료형에는 0부터  42억의 범위에 있는 1개의 값을 저장할 수 있다.

 

부호를 붙이면 음수 21억부터 양수 21억까지 범위에서 고를 수 있다.

 

자료형을 배우면서 많은 경우 와닿지 않는 부분이니까 확실히 이해한 것인지 스스로 질문해본다.

 

 

*변수의 범위

 

C++ 는 그렇게 막막한 언어가 아니다. 도움을 주기 위해 다양한 라이브러리와 헤더파일을 제공하고 있다. climits 라이브러리를 전처리기에 포함시키면 각 자료형의 최대값과 최소값을 알아낼 수 있다. 아래 limits.h 헤더파일에서 char 형 비트 8, 값의 범위 -128~127 정수형 char (255,ff)를 확인할 수 있다.

 

#include <iostream>
#include <climits>

using namespace std;

int main()
{
    cout << "<signed char  range> " << endl
            << " max : " << SCHAR_MAX
            << " min : "<<SCHAR_MIN << endl;

    cout << "<unsigned char  range> " << endl
            << " max : " << UCHAR_MAX << endl;
    
    cout << "<signed int range> " << endl
            << " max : " << INT_MAX
            << " min : "<< INT_MIN << endl;

    cout << "<unsigned int  range> " << endl
            << " max : " << UINT_MAX <<endl;
    return 0;
}

 

 

climits 를 포함시켜서 몇가지 자료형의 한계를 확인해본다. unsigned char의 경우 255까지이고 unsigned int 형의 경우 4,294,967,295 이다. 

 

42억은 int 형 정수를 말하는 것이다. 정수를 다룰 때 int 형을 자주 쓸 것이기 때문에 이 정도는 알고 있어야 한다.

 

int 형의 경우 컴퓨터 시스템에 따라 다르다. 16bit 컴퓨터에게 int 형은 16 bit 이고 32bit 시스템에서는 32bit 이다. 요즘 나오는 CPU들은 64비트로 나온다.

그림에서 보는 것처럼 CPU도 64비트를 지원하고 윈도우즈 10도 64비트 시스템이다. 

 

이 경우에도 C++의 int 는 32비트인데, 64비트를 사용하기 위해서는 long long  int 를 사용할 수 있다.

 

64비트라는 숫자는 18,446,744,073,709,551,616 으로 일상생활에서 만날일이 별로 없는 아주 큰 숫자이다.

 

32비트의 42억에 비하면 큰 차이가 있는 것 같다. 32비트의 2배가 64비트가 아니라 32비트의 2의32승이라는 것에 주의한다.

마지막으로 정수형을 정리하면 아래와 같다. 이들을 사용해서 변수로 만들 것이다.

type

size

range

char

1 byte

-128~127

unsigned char

1 byte

0~255

signed char

1 byte

-128~127

short

2 byte

-32768 ~ 32767

unsigned short

4 byte

0 ~ 65535

int

4 byte

-2147483648 ~  214783647

unsigned int

2 byte

0 ~ 4294967295

long

4 byte

-2147483648 ~  214783647

unsigned long

4 byte

0 ~ 4294967295

 

공유하기

facebook twitter kakaoTalk kakaostory naver band