[C++] 타입 변환 1: 값, 타입 변환 / 암시적, 명시적 변환
타입 변환 1: 값, 타입 변환 / 암시적, 명시적 변환
인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다.
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!
타입 변환 유형 (비트열 재구성 여부)
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;
전체 코드
더보기
#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;
}
실행화면
'⭐ Programming > C++' 카테고리의 다른 글
[C++] 타입 변환 3: 포인터 타입 변환 (0) | 2022.04.08 |
---|---|
[C++] 타입 변환 2: 참조 타입 변환 (0) | 2022.04.08 |
[C++] 동적 할당: new, delete (0) | 2022.04.07 |
[C++] 동적 할당: malloc, free, void*, double free, Use-After-Free (0) | 2022.04.07 |
[C++] 객체지향 마무리 (0) | 2022.04.06 |
댓글
이 글 공유하기
다른 글
-
[C++] 타입 변환 3: 포인터 타입 변환
[C++] 타입 변환 3: 포인터 타입 변환
2022.04.08 -
[C++] 타입 변환 2: 참조 타입 변환
[C++] 타입 변환 2: 참조 타입 변환
2022.04.08 -
[C++] 동적 할당: new, delete
[C++] 동적 할당: new, delete
2022.04.07 -
[C++] 동적 할당: malloc, free, void*, double free, Use-After-Free
[C++] 동적 할당: malloc, free, void*, double free, Use-After-Free
2022.04.07