ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4장. 형변환이란?
    C++ 기본 문법 알아보기 2019. 1. 6. 23:10

    정상적인 형변환


    저번 시간에 자료형(타입)에 대해서 배워보았다.


    그런데 여기서 한가지 의문이 들 수 있다.


    "int형 정수 변수에 float형 실수 값을 대입하면 어떻게 될까?"


    과엽 실수 값이 정수 변수로 들어가면 값이 정상적으로 저장 될까?


    형변환은 아주 흔하게 발생한다.


    값이 잘리는 경우도 있고, 엉뚱한 값으로 바뀌는 경우도 있다.


    다음 형변환 예제를 보자.


    #include <iostream>

    using namespace std;


    int main()

    {

    // 값이 들어있는 변수 선언

    int i = 65;

    float f = 66.77f;

    char c=  'R';

    bool b = true;


    // 형변환에 사용할 변수들 선언

    int fti, cti, bti;

    float itf, ctf, btf;

    char itc, ftc, btc;

    bool itb, ftb, ctb;


    // int형 변수 형변환

    itf = i;

    itc = i;

    itb = i;


    // float형 변수 형변환

    fti = f;

    ftc = f;

    ftb = f;


    // char형 변수 형변환

    cti = c;

    ctf = c;

    ctb = c;


    // bool형 변수 형변환

    bti = b;

    btf = b;

    btc = b;


    // 출력

    cout << "int : " << i << "\n\tto float :  " << itf << "\n\tto char : " << itc << "\n\tto bool : " << itb << "\n";

    cout << "float : " << f << "\n\tto int :  " << fti << "\n\tto char : " << ftc << "\n\tto bool : " << ftb << "\n";

    cout << "char : " << c << "\n\tto int :  " << cti << "\n\tto float : " << ctf << "\n\tto bool : " << ctb << "\n";

    cout << "bool : " << b << "\n\tto int :  " << bti << "\n\tto float : " << btf << "\n\tto char : " << btc << "\n";


    return 0;

    }



    형변환이 된 것을 볼 수 있다.


    형변환시 값이 변경되는 경우를 보자


    • 실수 타입에서 정수 타입으로 형변환이 발생하는 경우에는 실수의 소수점 이하 부분이 잘려서 들어간다(반올림 아님)
    • 모든 타입에서 bool 타입으로 형변환할 때, 모든 0이 아닌 수는 true, 즉 1로 바뀌고 0은 그대로 false로 들어간다.
    • 다른 타입에서 char 타입으로 형변환할 때는 값의 변화가 발생하지 않는다. 출력만 값에 맞는 문자가 나오는 것이다 ( ex : int 65 -> char 'A'

    문제가 생기는 형변환

    위의 결과처럼 정상적으로 형변환이 되는 경우도 있지만 그렇지 않은 경우도 있다.


    예제를 보자.


    #include <iostream>

    using namespace std;


    int main()

    {

    // 정수 타입간의 형변환

    int i = 131071;

    unsigned short itus = i;

    short its = i;


    // 실수 타입간의 형변환

    double d = 12345678901234.56789;

    float dtf = d;


    // 실수에서 정수 타입으로 형변환

    float f = 76543.21f;

    short fts = f;


    // 정수에서 실수 타입으로 형변환

    int big_i = 1234567890;

    float itf = big_i;


    cout << fixed;

    cout << "int : " << i << "\n\tto unsigned short : " << itus << "\n\tto short : " << its << "\n";

    cout << "double : " << d << "\n\tto float : " << dtf << "\n";

    cout << "float : " << f << "\n\tto short : " << fts << "\n";

    cout << "int : " << big_i << "\n\tto float : " << itf << "\n";


    return 0;

    }



    왜 형변환에 문제가 생기는지 하나하나 알아보자.


    우선 정수 타입간의 형변환이다.


    작은 크기의 정수 타입이 보관하기에는 너무 큰 수를 대입하고 있어 문제가 생긴다.


    실수 타입간의 형변환에서는 float 타입이 보관하기에는 정밀도가 높은 실수를 대입하고 있다.


    형변환 시에 근사 값으로 변환되는데, 불가능한 경우에는 이상한 값으로 변질될 수 있다.


    실수에서 정수 타입으로 형변환은 76543이라는 정수는 short 타입이 담기에는 너무 큰 수이기 때문에 문제가 생긴다.


    마지막 정수 타입에서 실수 타입으로 형변환은 실수 타입은 정수 타입보다 큰 수를 보관할 수 있지만, 정밀도를 잃어버린다.


    이렇게 문제가 생기는 형변환을 알아보았다.



    명시적인 형변환


    형변환에는 명시적인 형변환과 암시적, 혹은 묵시적 형변환이 있다.


    우리가 지금까지 배웠던 형변환은 암시적 형변환이었다.


    이제 명시적인 형변환을 배워보자!


    #include <iostream>

    using namespace std;


    int main()

    {

    int i = 65;

    float f = 66.77f;

    char c = 'C';


    cout << "int i = " << i << "\n";

    cout << "(char)i = " << (char)i << "\n";

    cout << "(bool)i = " << (bool)i << "\n";


    cout << "float f = " << f << "\n";

    cout << "(int)f = " << (int)f << "\n";


    cout << "char c = " << c << "\n";

    cout << "(int)c = " << (int)c << "\n";

    }



    이렇게 명시적으로 형변환을 시키게 되면 굳이 다른 타입의 변수에 대입하지 않아도 형변환을 할 수 있다.


    그리고 여기서 알아야 할 것은 명시적인 형변환에는 임시 변수가 수반된다는 것이다.


    우리가 (char)i 라고 적었을 때, 내부적으로 char 타입의 임시 변수가 하나 만들어진다.


    그리고 i의 값이 임시 변수에 대입되면서 형변환이 발생하는 것이다.


    이렇게 명시적인 형변환을 쓰면 의도를 명확히 알 수 있다.


    적절히 사용해 컴퓨터 뿐만 아니라 동료들에게도 의도를 알리자!


    다음 시간에 연산자에 대해 알아도록 하자.

Designed by Tistory.