ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3장. 타입에 대하여
    C++ 기본 문법 알아보기 2019. 1. 3. 12:30

    타입(자료형)이란?


    변수에는 모두 타입(자료형)이 있다.


    그렇다면 과연 타입이 무엇일까?


    저번 글에서도 말했듯이 변수란 자료를 담는 그릇이다.


    그렇다면 자료가 숫자인지 문자인지와 같이 자료의 종류에 따라서 그릇의 종류도 달라져야 할 것이다.


    아래의 코드를 보자


    int a;


    a라는 변수를 선언하고 있는 문장이다.


    그렇다면 a 앞에 있는 int가 무엇일까?


    여기서 int가 바로 변수 a의 자료형이 되는 것이다.


    int는 integer의 준말로 정수를 담을 수 있음을 의미하는 자료형이다.


    숫자를 담는 자료형에도 아주 많은 종류가 있는데 아래의 코드를 보자.


    int main()

    {

    // 변수 선언

    short int si;

    unsigned short int usi;

    int i;

    unsigned int ui;

    long int li;

    unsigned long ul;


    // 작은 값 대입

    si = 40000;     // Error : 2바이트인 short int에게는 너무 큰 값

    usi = 40000;   // unsigned 타입이기 때문에 들어감

    i = 40000;

    ui = 40000;

    li = 40000;

    ul = 40000;


    // 조금 더 큰 값 대입

    si = 70000;    // Error : 너무 큰 값

    usi = 70000;  // Error : unsigned short int 에게도 너무 큰 값

    i = 70000;

    ui = 70000;

    li = 70000;

    ul = 70000;


    // 더 큰 값 대입

    si = 2200000000;    // Error : 너무 큰 값

    usi = 2200000000;  // Error : 너무 큰 값

    i = 2200000000;    // Error : int의 양수 범위는 2^31 - 1까지이기 때문에 너무 큰 값

    li = 2200000000;   // Error : int와 동일

    ui = 2200000000;

    ul = 2200000000;


    // 어디까지 가능할까?

    ui = 4300000000;   // Error : unsigned int 의 범위는 양수로 2^32 - 1까지이기 때문에 너무 큰 값

    ul = 4300000000;   // Error : unsigned int와 동일


    // 음수 대입

    si = -100;

    usi = -100; // Error : unsigned는 음수 보관 불가능

    i = -100;

    ui = -100;  // Error : unsigned는 음수 보관 불가능

    li = -100;

    ul = -100;  // Error : unsigned는 음수 보관 불가능


    return 0;

    }


    주석에 Error가 있는 부분은 실행 시 모두 경고가 뜨거나 오버플로우 혹은 언더플로우의 값이 나올 것이다.


    컴퓨터는 메모리 상에서 자료형에 따라 변수의 크기만큼 공간을 확보해 놓는다.


    하지만 담을 수 있는 값보다 더 작거나 더 큰 값을 넣게되면 더 큰 값일 경우에는 가장 작은 값부터, 더 작은 값일 경우에는 가장 큰 값부터 다시 시작되게 된다.


    이것이 언더플로우와 오버플로우다.


    각 자료형의 크기는 컴퓨터의 시스템에 따라 다를 수 있다.


    그렇다면 변수의 크기를 출력해보자!


    다음 코드를 따라 쳐보자.


    #include <iostream>

    using namespace std;


    int main()

    {

    cout << "short int : " << sizeof(short int) << " bytes\n";

    cout << "unsigned short int : " << sizeof(unsigned short int) << " bytes\n";

    cout << "int : " << sizeof(int) << " bytes\n";

    cout << "unsigned int : " << sizeof(unsigned int) << " bytes\n";

    cout << "long int : " << sizeof(long int) << " bytes\n";

    cout << "unsigned long int : " << sizeof(unsigned long int) << " bytes\n";

    return 0;
    }



    몇 바이트인지 잘 나오는 것을 볼 수 있다.



    signed? unsigned?


    자 이제 signed와 unsigned에 대해 조금 더 자세히 알아보자.


    비교적 크기가 작은 unsigned short int와 short int로 비교를 해보자.


    unsigned short int는 2바이트의 크기이므로 2^16, 즉 65536개의 상태를 가질 수 있다.


    그렇다면 과연 unsigned short int는 65536까지 표현할 수 있을까?


    아니다. 첫번째 상태는 모든 비트가 0일 때, 즉 0부터 시작이기 때문에 0~2^16 - 1이 되는 것이다.


    자 그렇다면 short int는 어떨까?


    정확히 말하면 signed short int인데 똑같이 2바이트이므로 65536개의 상태를 가질 수 있다.


    하지만 short int는 음수의 값도 표현해야 하기 때문에 음수와 양수가 각각 32768만큼의 상태를 나눠 갖는다.


    음수는 -32768~-1까지, 양수는 0부터 시작이므로 0~32767까지 표현 가능하다.


    꼭 short int가 아니더라도 unsigned - int의 경우는 같은 원리로 동작한다.



    실수 자료형


    정수 자료형을 알아봤으니 실수 자료형도 알아보자.


    실수의 자료형을 보통 부동 소수점 타입이라고 말한다.


    여기서 부동은 "움직이지 않는다"가 아니라 소수점이 이리저리 옮겨다닐 수 있다는 뜻이다. 


    백문이 불여일견이다. 바로 코드를 보자!


    int main()

    {

    // 실수 자료형의 변수 선언

    float f;

    double d;

    long double ld;


    // 실수 대입 1

    f = 0.00123f;

    d = 1.23;

    ld = 123.0;


    // 실수 대입 2

    f = 1.23E-3f;

    d = 1.23E0;

    ld = 1.23E2;


    return 0;

    }


    여기서 의문점이 하나 생길 것이다.


    왜 float의 경우에만 값 뒤에 f를 붙여줄까?


    그 이유는 실수 뒤에 f가 붙어 있지 않으면 double 타입의 실수라고 생각하기 때문에 정확하게 해주기 위해 f를 붙이는 것이다.


    자 이제 1.23E-3과 같은 실수의 표기법을 알아보자.


    E와 뒤에 나오는 수는 10의 몇 제곱인지를 나타낸다.


    1.23E0 = 1.23 * 10^0 = 1.23,  1.23E2 = 1.23 * 10 ^ 2 = 123.0


    이런 식으로 식을 줄여 표현할 수 있다.


    문자 자료형


    숫자는 대충 이해가 끝났으니 이제 문자 표현 방법에 대해 알아보자.


    char과 wchar_t는 문자를 보관하는데 사용하는 자료형이다.


    wchar_t는 char과 다르게 세계 각국의 문자와 기호들을 표현할 수 있다.


    실제 프로그래밍 시에는 char을 주로 사용하고 wchar_t는 특별한 상황에서만 사용할 것이다.


    char 자료형의 예제를 보자.


    #include <iostream>

    using namespace std;


    int main()

    {

    char a;

    char b;

    char c;


    a = 'G';

    b = 'O';

    c = 'D';


    cout << a << b << c << "\n";


    return 0;

    }



    잘 출력이 되는 것을 확인할 수 있다.



    ASCII 코드를 통한 표현


    변수의 자료형에 따라서 문자가 들어가거나 숫자가 들어가는 것을 볼 수 있었다.


    하지만 컴퓨터의 내부에서는 결국 다 2진수의 숫자로 저장이 된다.


    ASCII라는 문자와 숫자를 대응시켜 놓은 약속이 있다.


    문자로 숫자를, 숫자로 문자를 표현해보자.


    #include <iostream>

    using namespace std;


    int main()

    {

    int a = 'A';

    cout << a << "\n";


    char b = 97;

    cout << b << "\n";


    return 0;

    }



    대문자 A의 아스키 코드는 65, 소문자 a의 아스키 코드는 97이란 것을 알 수 있다.



    진수 표현법


    이제 문자 표현법도 알아보았으니 진수 표현법을 알아보자.


    지금까지 프로그램을 작성하면서 10진수만 사용했었다.


    하지만 필요에 따라 8진수와 16진수도 사용할 수 있다.


    예제를 보자!


    #include <iostream>

    using namespace std;


    int main()

    {

    int decimal = 41;

    int octal = 041;

    int hexadecimal = 0x41;


    cout << "41 = " << decimal << "\n";

    cout << "041 = " << octal << "\n";

    cout << "0x41 = " << hexadecimal << "\n";


    return 0;

    }



    8진수는 앞에 0, 16진수는 앞에 0x를 붙여주면 된다. (영문자 O가 아니다!)



    이스케이프 문자열이란?


    코드를 보면 "\n" 이 문자열이 계속 등장한다.


    개행을 해주는 문자열이란 것은 알고 있지만 그 이상은 알지 못할 것이다.


    역슬래쉬로 시작하는 이 문자열들을 "이스케이프 문자열"이라고 한다.


    다양한 종류가 있다.


    특수문자 

    아스키 코드 상에서의 표현 

    C++에서의 표현 

    개행문자 

    NL(LF) 

    \n 

    수평탭 

    HT 

    \t 

    수직탭 

    VT 

    \v 

    백스페이스 

    BS 

    \b 

    캐리지 리턴

    CR 

    \r 

    폼 필드 

    FF 

    \f 

    벨소리 

    BEL 

    \a 

    역슬래쉬 

    \\ 

    물음표 

    \? 

    작은 따옴표 

    \' 

    큰 따옴표 

    \" 

    8진수 

    ooo 

    \ooo 

    16진수 

    hhh 

    \xhhh 


    예제를 보고 활용하는 법을 보자!


    #include <iostream>

    using namespace std;


    int main()

    {

    // Hi, Bori!를 치려다 잘못 작성

    cout << "Hi, Boah!";


    // 백스페이스로 뒤에 두 글자를 지운다.

    cout << "\b\b\b";


    // 정정

    cout << "ri!\n";


    return 0;

    }



    정정되어 나오는 것을 볼 수있다.



    True? False?


    마지막으로 Bool 타입에 대해 알아보자.


    Bool 자료형은 true 혹은 false의 값만 가질 수 있다.


    true는 1의 값, false는 0의 값을 나타낸다.


    아직은 쓸 일이 없지만 나중에 나오는 제어문과 반복문에서 유용하게 쓸 것이다!


    우선 bool 타입의 변수 출력만 해보자.


    #include <iostream>

    using namespace std;


    int main()

    {

    bool b1;

    bool b2;


    b1 = true;

    b2 = false;


    cout << "b1 = " << b1 << "\n";

    cout << "b2 = " << b2 << "\n";


    return 0;

    }



    true가 1, false가 0이라는 값을 출력한다!


    다음 시간에는 형변환에 대해 알아보자.

Designed by Tistory.