c++/기초

형변환

코드망령 2026. 5. 29. 18:19

형변환 (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는 상위 바이트가 잘려 데이터 손실이 발생할 수 있다.
  • 형변환은 의도를 명확하게 하기 위해 명시적으로 사용하는 것이 좋다.

'c++ > 기초' 카테고리의 다른 글

정적 변수  (0) 2026.05.29
오버로딩  (0) 2026.05.29
전역변수와 지역변수  (0) 2026.05.29
함수  (0) 2026.05.29
구조체  (0) 2026.05.29