1. 암시적 형변환(implicit cast)
컴파일러가 자동으로 변환
주로 작은 크기의 자료형에서 큰 크기의 형식으로 변환
#include <iostream>
using namespace std;
int main(){
float float_value = 1.5f; // 원본 데이터는 부동 소수점 형 1.5
double double_value = float_value; // 숫자 승격: 데이터 유실 없음
int int_value = float_value; //숫자 변환: 데이터 유실 발생
cout << "float_value: " << float_value << endl;
cout << "double_value: " << double_value << endl;
cout << "int_value: " << int_value << endl;
return 0;
}

double는 float와 같은 부동소수점 계열인데 더 큰 자료형이므로, 유실없이 float형을 자동으로 double형으로 바꾼다
이를 숫자 승격이라고 부른다(암시적 형변환)
double double_value = float_value;
반면, 부동소수점에서 정수로 서로 다른 자료형으로 변환하거나 크기가 더 작은 자료형으로 변환하면
숫자 변환이 발생
이 경우에는 데이터가 유실될 가능성이 있다
실행 결과에서 1.5에서 소수점 아래 한자리가 유실되어 1만 남는다
int int_value = float_value;

유실 가능성이 있는 경우 컴파일러가 경고 메시지를 보여준다
경고 메시지는 무시해도 실행되기 때문에, 무시하는 경우가 많지만, 확인하지 않으면
의도치 않는 결과를 볼 수도 있기 때문에 주의
2. 명시적 형변환(explicit cast)
개발자가 의도적으로 직접 변경
데이터 손실을 방지할 때,
변수의 범위를 초과하는 값을 적절한 범위로 조절할 때
서로 다른 데이터 유형끼리 계산할 때
데이터 유형 간의 호환성이나 연산의 정확성을 유지할 목적으로 사용
너무 남용하면 코드를 이해하기 어려워지니 주의
#include <iostream>
using namespace std;
int main(){
int int_a = 10;
int int_b = 5;
int int_avg = (int_a + int_b) / 2;
float float_avg_1 = (int_a + int_b) / 2; //암시적 형변환: 데이터 유실
float float_avg_2 = float(int_a + int_b) / 2; //명시적 형변환
cout << "int_avg: " << int_avg << endl;
cout << "float_avg_1: " << float_avg_1 << endl;
cout << "float_avg_2: " << float_avg_2 << endl;
return 0;
}

암시적 형변환이 발생한 곳은 두 정수의 평균을 구하는 곳
소수점이 발생할 수 있어서 결과를 float로 받았는데 결과는 정수로 나옴
C++에서 나눗셈 연산 /은 피연산자들의 타입에 따라 결과가 다르다
float float_avg_1 = (int_a + int_b) / 2;
(int_a + int_b)가 정수형이고 2가 정수형이므로, 정수형끼리 나눗셈 연산은 소수점을 버려서 그 결과가 정수형이다
여기에 결과를 float로 하려고 했지만, 이미 (int_a + int_b)/2가 정수형이므로, 소수점이 사라져있어서 float로 해도
소수점이 나오지 않아
/ 연산에서 실수가 하나라도 섞여 있으면 그 결과는 실수로 나온다
만약 정수 나눗셈의 결과를 실수로 받고 싶다면, 명시적 형변환을 통해 타입 캐스팅을 해줘야한다
float float_avg_2 = float(int_a + int_b)/2;
int_a + int_b 부분을 float형으로 변환할 것임을 명시적으로 표시하여, 이후 연산은 모두 float형으로 처리된다
그래서 데이터가 유실되지 않고, float형 변수에 저장되어 7.5가 잘 나온다
C++에서는 C언어 방식의 타입 캐스팅 (float)(int_a + int_b)도 지원
#include <iostream>
using namespace std;
int main(){
int int_a = 10;
int int_b = 5;
float float_avg_2 = (float)(int_a + int_b) / 2; //명시적 형변환
cout << "float_avg_2: " << float_avg_2 << endl;
return 0;
}
3. 명시적 형변환 다른 방법들
1) static cast <변환 형식>(변환 대상)
논리적으로 변경할 수 있는 형변환 모두 가능
상속 관계에 있는 포인터끼리 변환도 가능
2) const_cast <변환 형식>(변환 대상)
포인터 및 레퍼런스 형식에서만 사용 가능
const, volatile 제거할 때 사용
3) reinterpret_cast <변환 형식>(변환 대상)
일반적인 명시적 형변환과 동일
const를 사용하는 변환 대상은 사용할 수 없음
4) dynamic_cast <변환 형식>(변환 대상)
클래스의 포인터 및 레퍼런스 변수 간의 형변환 시 사용
안전한 다운 캐스팅을 위해 사용
'프로그래밍 > C++' 카테고리의 다른 글
C++의 연산자와 표현식 (0) | 2025.03.01 |
---|---|
키워드와 리터럴 (0) | 2025.02.15 |
L-value와 R-value?? (0) | 2025.02.12 |
C++ 변수 유효 범위 (0) | 2025.01.23 |
C++에서 사용하는 데이터 형식 (0) | 2024.12.30 |