C++의 변수 형식 변환

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;
}

 

 

etc-image-0

 

 

 

double는 float와 같은 부동소수점 계열인데 더 큰 자료형이므로, 유실없이 float형을 자동으로 double형으로 바꾼다

 

이를 숫자 승격이라고 부른다(암시적 형변환)

 

double double_value = float_value;

 

 

반면, 부동소수점에서 정수로 서로 다른 자료형으로 변환하거나 크기가 더 작은 자료형으로 변환하면 

 

숫자 변환이 발생

 

이 경우에는 데이터가 유실될 가능성이 있다

 

실행 결과에서 1.5에서 소수점 아래 한자리가 유실되어 1만 남는다

 

int int_value = float_value;

 

 

etc-image-1

 

 

유실 가능성이 있는 경우 컴파일러가 경고 메시지를 보여준다

 

경고 메시지는 무시해도 실행되기 때문에, 무시하는 경우가 많지만, 확인하지 않으면

 

의도치 않는 결과를 볼 수도 있기 때문에 주의

 

 

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;
}

 

 

 

etc-image-2

 

 

 

암시적 형변환이 발생한 곳은 두 정수의 평균을 구하는 곳

 

소수점이 발생할 수 있어서 결과를 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 <변환 형식>(변환 대상)

 

클래스의 포인터 및 레퍼런스 변수 간의 형변환 시 사용

 

안전한 다운 캐스팅을 위해 사용

 

 

 

728x90

'프로그래밍 > 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