프로그래밍/C++

#46. 타입변환

코딩하는상후니 2022. 7. 20. 22:05

 

@타입 변환 유형  (  비트열 재구성 여부  )
 

 


 

1. 값 타입 변환
=> 의미를 유지하기 위해서, 원본 객체와 다른 비트열 재구성
 
int a = 0x12345678;  //@2의 보수
float b = (float)a;    //@부동소수점
cout << b << endl;
 
=> 최대한 a 의 숫자를 유지하기 위해 b 에다가 바꿔치기 함.
 
 
2. 참조 타입 변환
=> 비트열을 재구성하지 않고, '관점' 만 바꾸는 것
=> 거의 쓸일은 없지만, 포인터 타입 변환도 '참조 타입 변환' 과 동일한 룰
 
int a = 12345678;  // @2의 보수
float b = (float&)a;  // @부동소수점
cout << b << endl;
 
 
 
*참조 타입을 변환한다는 소리는 무슨 말일까 ??
=> @간단한 예제를 보자.
 
float e = 123.123;
int f = (int&)e;
cout << f << endl;
 
int x = e;
 
float g = (float&)e;
cout << g << endl;
 
이 때,
e 를 부동소수점으로 표현하면,
0100 0010 1111 0110 0011 1110 1111 1010 (2)
= 0x42F63EFA
 
int f = (int&)e; 실행 시,
'부동소수점을 이용하지 않고'  '2의보수' 를 이용해 int 값으로 읽어들임.
따라서, 1,123,434,234 출력
 
하지만 int x = e;  실행 시,
즉, '부동소수점을 이용해' 값을 x 에 대입, 또한 실수부는 날아감.
x = 123; 출력
 
 
즉, 2의보수(int&)로 보다가 부동소수점(float&)으로 데이터를 읽을 수 있다 ( 참조타입변환) 는 소리.
 
 
 

 

 
@안전도 에 따른 분류
 
 
1. 안전한 변환
=> 의미가 항상 100 % 일치하는 경우
=> 같은 타입이면서 크기만 더 큰 바구니로 이동
=> 작은 바구니 -> 큰 바구니로 이동 OK  ( 업캐스팅 )
ex) char -> short  , int -> double ....
 
 
2. 불안전한 변환
=> 의미가 항상 100 % 라고 보장 못함.
=> 타입이 다르거나,
큰 바구니 -> 작은 바구니 이동.
 
 

 

@프로그래머 의도에 따라 분류
 
 
1. 암시적 변환
=> 이미 알려진 타입 변환 규칙에 따라서 컴파일러가 '자동' 으로 변환
int a = 123456789;
float b = a;
 
 
2. 명시적 변환
int a = 123456789;
int* b = (int*)a; // 명시적
=> 이미 알고 있으니 그냥 형변환해라.
 

 


 

 
@아무런 연관 관계가 없는 클래스 사이의 '값 타입'  변환
=> 일반적으론 안됨.
 
1. 타입 변환 생성자
Dog(const Knight& other) { }
 
 
2. 타입 변환 '연산자
operator Knight()
{
return (Knight)*this;
}
 
 
Knight k1;
Dog dog = (Dog)k1;
Dog dog2 = k1;
 
Knight k2 = dog;
=> dog -> Knight 으로 형변환!
 
 

 

 
@연관 없는 클래스 사이의 '참조 타입' 변환
 
Knight k1;
Dog& dog = k1; => ERROR !!
 
Dog& dog = (Dog&)k1;
dog._qute = 12;
 
 
=> 관점을 바꿔주는 개념.
=> 결국, 포인터크기를 바꿔준 것과 같음.
 
 

 
@상속 관계에 있는 클래스 사이의 변환
 
class BullDog : public Dog
{
public:
int _french = 1;
};
 
1. 값 타입 변환
=> 자식-> 부모 OK   /  부모 -> 자식 NO
 
BullDog bulldog;
Dog dog = bulldog;
 
 
 
2. 참조 타입 변환
=> 자식-> 부모 OK   /  부모 -> 자식 (암시적NO) (명시적OK)
 
Dog dog;
BullDog& bulldog = (BullDog&)dog;  => '어떤 위험성이 존재하나 ??'
=> 실제 객체는 dog 인데 Bulldog 의 멤버변수 값으로 다른 주소를 건드리게 됨.
 
BullDog bulldog;
Dog& dog = bulldog;
 

 

*결론
 
@값 타입 변환  :  진짜 비트열도 바꾸고 , 논리적으로 말이 되게 바꾸는 변환
@참조 타입 변환  :  우리의 '관점' 만 바꾸는 변환
 
 

 


본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.

 

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

#48. C++ 캐스팅  (0) 2022.07.20
#47. 깊은 복사 & 얕은 복사  (0) 2022.07.20
#45. 동적할당  (0) 2022.07.20
#44. 연산자 오버로딩  (0) 2022.07.20
#43. 초기화 리스트  (0) 2022.07.20