형변환 (Type Casting)
형변환은 데이터의 자료형(Type)을 다른 자료형으로 변환하는 것을 의미한다.
int a = 10;
double b = a;
위 코드에서는 int형 데이터를 double형으로 변환하여 저장한다.
암시적 형변환 (Implicit Conversion)
컴파일러가 자동으로 수행하는 형변환이다.
예시
int a = 10;
double b = a;
실제 동작
double b = 10.0;
결과
b = 10.0
특징
- 컴파일러가 자동으로 수행한다.
- 일반적으로 작은 자료형에서 큰 자료형으로 변환된다.
- 데이터 손실이 없는 경우가 많다.
예시
char a = 'A';
int b = a;
결과
b = 65
문자의 아스키 코드 값이 저장된다.
명시적 형변환 (Explicit Conversion)
개발자가 직접 형변환을 지정하는 방식이다.
C 스타일 형변환
double b = (double)a;
예시
int a = 10;
double b = (double)a;
C++ 스타일 형변환
double b = static_cast<double>(a);
예시
int a = 10;
double b = static_cast<double>(a);
특징
- 개발자가 직접 형변환을 수행한다.
- 의도를 명확하게 표현할 수 있다.
- 현대 C++에서는
static_cast사용을 권장한다.
왜 명시적 형변환을 사용할까?
자동 형변환으로 인해 예상하지 못한 결과가 발생할 수 있기 때문이다.
예시
int a = 10;
int b = 3;
double result = a / b;
실제 결과
3
a / b가 먼저 정수 연산으로 수행되기 때문이다.
해결
double result = static_cast<double>(a) / b;
결과
3.333333
Promotion (승격)
더 작은 자료형을 더 큰 자료형으로 변환하는 것을 승격(Promotion)이라고 한다.
예시
char -> int
int -> long
float -> double
특징
- 더 큰 자료형으로 변환된다.
- 데이터 손실이 발생하지 않는다.
- 대부분 자동으로 수행된다.
예시
char ch = 'A';
int num = ch;
결과
65
float a = 3.14f;
double b = a;
결과
3.14
일반적인 형변환
모든 형변환이 안전한 것은 아니다.
큰 자료형에서 작은 자료형으로 변환하면 데이터 손실이 발생할 수 있다.
이를 Narrowing Conversion(축소 변환)이라고 한다.
double → int
소수점 이하가 제거된다.
double a = 10.556;
int b = a;
결과
10
실제 동작
10.556 -> 10
소수점 이하는 버려진다.
int → char
int는 4Byte
char는 1Byte
이므로 데이터 손실이 발생할 수 있다.
int num = 300;
char ch = num;
메모리 예시
int 300
00000000 00000000 00000001 00101100
char는 1Byte만 저장 가능
00101100
결과
44
상위 바이트는 잘리고 하위 바이트만 남는다.
정수 나눗셈 주의
int a = 10;
int b = 3;
double result = a / b;
결과
3
형변환 사용
double result = static_cast<double>(a) / b;
결과
3.333333
C++ 형변환 종류
static_cast
일반적인 형변환
double b = static_cast<double>(a);
가장 자주 사용한다.
const_cast
const 속성 제거
const int a = 10;
int* ptr = const_cast<int*>(&a);
reinterpret_cast
비트 단위 재해석
int a = 10;
char* ptr = reinterpret_cast<char*>(&a);
위험성이 높아 특별한 경우에만 사용한다.
dynamic_cast
상속 관계에서 안전한 다운캐스팅
Animal* animal = new Dog();
Dog* dog = dynamic_cast<Dog*>(animal);
RTTI를 사용하여 형변환을 검사한다.
형변환 우선순위
일반적으로
char
↓
short
↓
int
↓
long
↓
long long
↓
float
↓
double
작은 자료형이 큰 자료형으로 자동 승격된다.
정리
- 형변환은 자료형을 다른 자료형으로 변경하는 것이다.
- 암시적 형변환은 컴파일러가 자동으로 수행한다.
- 명시적 형변환은 개발자가 직접 수행한다.
- C++에서는
static_cast사용을 권장한다. - 승격(Promotion)은 작은 자료형을 큰 자료형으로 변환하는 것이다.
- 승격은 일반적으로 안전하다.
- 축소 변환(Narrowing Conversion)은 데이터 손실이 발생할 수 있다.
double → int는 소수점 이하가 제거된다.int → char는 상위 바이트가 잘려 데이터 손실이 발생할 수 있다.- 형변환은 의도를 명확하게 하기 위해 명시적으로 사용하는 것이 좋다.