본문 바로가기
■ Programming /C++

[C++] 4-7. [데이터 타입/ 자료형] 형변환(Casting , 캐스팅)

by Popbox 2017. 3. 20.
반응형

[C++] 4-7. [데이터 타입/ 자료형] 형변환(Casting , 캐스팅)

 

 

[뇌를 자극하는 C++ , 저.이현창]책을 기준으로 작성하였습니다

 

 

형변환(Casting , 캐스팅)

 

형변환(Casting)이라는 주제는 C++ 프로그래밍에 있어서 아주 중요한 부분을 차지하고 있습니다.

형변환은 여러 가지 경우에 발생할 수 있습니다. 그 중에서 대표적인 경우가 한 변수에 보관되어 있던 값을 다른 타입의 변수에 대입하는 경우입니다.


​형변환은 아주 흔하게 발생합니다.

저희가 의식하지 못하는 사이에도 컴퓨터에 의해 형변환이 발생합니다.

또한 저희가 직접 형변환을 시켜주어야 하는 경우도 생깁니다.

그만큼 형변환은 C++개발자의 일상 생활에서 빼놓을 수 없는 주제입니다.

 

 

  1. 다른 타입으로 형변환이 발생하는 경우 (묵시적 형변환)

 

-> 값이 어느 정도 잘리는 경우도 발생

-> 정밀도가 떨어지는 경우도 발생

-> 전혀 엉뚱한 값으로 바뀌는 경우 발생

[ 실수형 -> 정수형 ]

 

1
2
3
4
5
6
7
8
    float n = 10.5f;
 
    //float형을 int형으로 변환
    int casting = n;
    
    //출력
    cout << "n의 원형 값 : " << n << endl;
    cout << "n이 int로 캐스팅 된 값 : " << casting << endl;
cs

 

 

-> 실수형을 정수형으로 캐스팅하면 소숫점 이하 값은 손실 되는걸 볼 수 있다.(반올림이 아니다)


​언제 어떤 타입이 형변환 되는가?? 규칙이 존재합니다.

 


[중요]​

long double > double > float > unsigned long > long > unsigned int > int

​-> 왼쪽이 큰쪽이고 우측으로 갈수록 작은쪽이다.

-> a와 b가 존재할때 a는 int형 b는 float형 일때, b = a 라는 식이 존재하면????

-> 더 큰 자료형이 float임으로...  a가 float로 형변환 되어 b에 대입된다.

​[예외]

​한 가지 예외는 피연산자의 한 쪽이 long 타입이고 다른 한 쪽이 unsigned int 타입인 경우에는 두 가지 가능성이 있습니다.

기본 규칙에 의한다면 long 타입으로 나머지 한 쪽이 형변환해야 하지만, 만약에 long 타입이 unsigned int 타입의 값을 보관할 수 없는 경우라면 두 피연산자 모두 unsigned long 타입으로 형변환 합니다.


-> 예로 unsigned int 타입의 변수가 25억의 값을 가지면 long 타입은 값을 보관할 수 없는 경우입니다. 그래서 두 변수 모두 unsigned long 으로 형변환 후 연산이 됩니다.

 


 

  2. 사용자가 직접 형변환을 시키는 경우 (명시적 형변환)

 

개발자가 직접 형 변환을 시키는 것을 명시적 형변환이라 합니다.

​명시적으로 형변환을 시키게 되면 굳이 다른 타입의 변수에 대입하지 않더라도 형변환이 일어남.

 

 

1
2
3
4
5
    float n = 10.5f;
 
    //출력
    cout << "n의 원형 값 : " << n << endl;
    cout << "n이 int로 캐스팅 된 값 : " << (int)n<< endl;
cs

 

[tip] 명시적인 형변환에는 임시 변수가 수반된다.

이 변수는 우리에게 보이지는 않지만 컴퓨터가 내부적으로 사용하려는 목적으로 만드는 변수이다.


예를 들어, (char)i 라고 적어주면 , 내부적으로 char타입의 변수가 하나 만들어진다.

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

-> 문제점으로 성능 저하가 생길 수 있다.

 

 

  3. 형변환시에 값이 변경되는 경우

 

[1]실수 타입에서 정수 타입으로 형변환이 발생하는 경우 실수의 소주점 이하 부분이 잘리게 된다.

[2]모든 타입에서 bool 타입으로 형변환할 때, 모든 0이 아닌 수는 true 즉, 1로 바뀐다.

0은 그대로 0으로 남아 flase의 의미를 갖는다.

 

 

 

  4. 문제가 발생하는 형변환

 

문제가 발생하는 형변환의 공통적인 조건은 큰 타입에서 작은 타입으로 형변환이 일어난다는 것!!!!

(위의 예제들이 전부 해당됨)


큰 타입의 변수에 담겨있던 값이 작은 타입의 변수에 담길 수 없을 만큼 크다면 물리적 한계로 인해 올바른 값을 담을 수 없게 된다.

이런 경우에는 값의 일부가 잘려나가거나 예상할 수 없는 이상한 값으로 변질되어 버린다.

 

 

 

 


 

 감사합니다. 공감 한번 부탁드려요.

[ 다음 장 ]

[ C++ ] 5-1 . [연산자] 기본적인 연산자 1 :  

 

반응형

댓글