타입 변환 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;
}

 

실행화면