타입 변환 1: 값, 타입 변환 / 암시적, 명시적 변환

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 

 


 

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

 

1.  값 타입 변환

-  특징) 의미를 유지하기 위해서, 원본 객체와 다른 비트열 재구성

int a = 123456789; // 2의 보수
float b = (float)a; // 부동소수점(지수 + 유효숫자)
cout << b << endl;
더보기

 

&a(a의 주소값)을 검색하면 075bcd15가 나온다. 123456789는 16진수로 75BCD15

 

123456789는 16진수로 75BCD15

 

&b(b의 주소값) 검색. 4ceb79a3는 123456789가 아니다

 

 

 

2.  참조 타입 변환

-  특징) 비트열을 재구성하지 않고, '관점'만 바꾸는 것
-  거의 쓸일은 없지만, 포인터 타입 변환도 '참조 타입 변환' 동일한 룰을 따르니까 일석이조로 공부하자!

int a = 123456789; // 2의 보수
float b = (float&)a; // 부동소수점(지수 + 유효숫자)
cout << b << endl;
cout << "^^^^^^^^^^" << endl;

 


 

 

안전도 분류

 

1.  안전한 변환

-  특징) 의미가 항상 100% 완전히 일치하는 경우

-  같은 타입이면서 크기가 더 큰 바구니로 이동

-  작은 바구니 -> 큰 바구니로 이동 OK (업캐스팅)

-  ex) char -> short,  short -> int,  int -> __int54

int a = 123456789;
__int64 b = a;
cout << b << endl;
cout << "----------" << endl;

 

 

2.  불안전한 변환

-  특징) 의미가 항상 100% 일치한다고 보장하지 못하는 경우

-  타입이 다르거나

-  같은 타입이지만 큰 바구니 -> 작은 바구니 이동 (다운캐스팅)

int a = 123456789;
float b = a;
short c = a;
cout << b << endl;
cout << c << endl;
cout << "**********" << endl;

 

 

프로그래머 의도에 따라 분류 -  암시적, 명시적 변환 

 

1.  암시적 변환

-   특징) 이미 알려진 타입 변환 규칙에 따라서 컴파일러 '자동'으로 타입 변환

int a = 123456789;
float b = a; // 암시적으로
cout << b << endl;

 

 

2.  명시적 변환

int a = 123456789;
int* b = (int*)a;
cout << b << endl;

 

 

전체 코드

 

더보기
#include <iostream>
using namespace std;
// 타입 변환
// malloc -> void*을 반환하고, 이를 우리가 (타입 변환)을 통해 사용했었음
int main()
{
// ----------- 타입 변환 유형 (비트열 재구성 여부) ----------------
// [1] 값 타입 변환
// 특징) 의미를 유지하기 위해서, 원본 객체와 다른 비트열 재구성
{
int a = 123456789; // 2의 보수
float b = (float)a; // 부동소수점(지수 + 유효숫자)
cout << b << endl;
}
// [2] 참조 타입 변환
// 특징) 비트열을 재구성하지 않고, '관점'만 바꾸는 것
// 거의 쓸일은 없지만, 포인터 타입 변환도 '참조 타입 변환' 동일한 룰을 따르니까 일석이조로 공부하자!
{
int a = 123456789; // 2의 보수
float b = (float&)a; // 부동소수점(지수 + 유효숫자)
cout << b << endl;
cout << "^^^^^^^^^^" << endl;
}
// ---------- 안전도 분류 -------------
// [1] 안전한 변환
// 특징) 의미가 항상 100% 완전히 일치하는 경우
// 같은 타입이면서 크기가 더 큰 바구니로 이동
// 작은 바구니 -> 큰 바구니로 이동 OK (업캐스팅)
// ex) char -> short, short -> int, int -> __int54
{
int a = 123456789;
__int64 b = a;
cout << b << endl;
cout << "----------" << endl;
}
// [2] 불안전한 변환
// 특징) 의미가 항상 100% 일치한다고 보장하지 못하는 경우
// 타입이 다르거나
// 같은 타입이지만 큰 바구니 -> 작은 바구니 이동 (다운캐스팅)
{
int a = 123456789;
float b = a;
short c = a;
cout << b << endl;
cout << c << endl;
cout << "**********" << endl;
}
// --------- 프로그래머 의도에 따라 분류 -----------
// [1] 암시적 변환
// 특징) 이미 알려진 타입 변환 규칙에 따라서 컴파일러 '자동'으로 타입 변환
{
int a = 123456789;
float b = a; // 암시적으로
cout << b << endl;
}
// [2] 명시적 변환
{
int a = 123456789;
int* b = (int*)a;
cout << b << endl;
}
return 0;
}

 

실행화면