@타입 변환 유형 ( 비트열 재구성 여부 )
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 |