이 Step에서 다루는 것

  • 값 타입 캐스팅: “값을 다른 타입 표현으로 변환”
  • 참조/포인터 강제 캐스팅: “메모리 해석을 바꿔버리는 위험한 변환”
  • 암시적 변환 vs 명시적 변환
  • 실무 함정: 정수 나눗셈

학습 목표

  • int -> float가 “비트 재해석”이 아니라 값 변환임을 설명할 수 있다.
  • 축소 변환(큰 타입 -> 작은 타입)에서 왜 데이터 손실이 생기는지 설명할 수 있다.
  • (float&)a 같은 C-Style 강제 캐스팅이 왜 위험한지 설명할 수 있다.

값 타입 변환: 비트를 억지로 읽는 게 아니라 “값을 변환”한다

int a = 10;
float b = static_cast<float>(a); // 10 -> 10.0f

int big = 70000;
short s = static_cast<short>(big); // 축소 변환: 값 손실/변형 가능

핵심:

  • int -> float는 값 10을 부동소수점 10.0으로 바꾸는 값 변환입니다.
  • 작은 타입 -> 큰 타입은 보통 안전하지만,
  • 큰 타입 -> 작은 타입은 범위를 넘으면 데이터 손실/왜곡이 생길 수 있습니다.

참조 타입 강제 변환: “데이터는 그대로, 해석만 바뀜” (매우 위험)

int a = 123;
float& f = (float&)a; // 컴파일은 될 수 있어도, 동작은 안전하지 않음(UB 가능)

이런 캐스팅은:

  • 메모리의 실제 타입 계약을 깨뜨릴 수 있고
  • 엉뚱한 값/최적화 문제/크래시로 이어질 수 있습니다.

실전 기준:

  • 이런 형태의 C-Style 참조 캐스팅은 거의 금지에 가깝게 보는 편이 안전합니다.

암시적 vs 명시적: 의도를 코드에 남기자

  • 암시적 변환: 컴파일러가 자동으로 바꿈
  • 명시적 변환: 개발자가 의도적으로 변환을 지시
float x = 123;                     // 암시적
float y = static_cast<float>(123); // 명시적(의도 명확)

학습 포인트:

  • C-Style (float)a보다 C++ 스타일 static_cast<float>(a)가 의도가 더 분명하고,
  • 위험한 캐스팅과 구분하기도 쉽습니다.

정수 나눗셈 함정: 타입이 결과를 결정한다

int hp = 100;
int maxHp = 200;

float ratio1 = hp / maxHp;                        // 0   (int / int)
float ratio2 = static_cast<float>(hp) / maxHp;   // 0.5 (float / int)

핵심:

  • 나누기 전에 피연산자 타입이 정해집니다.
  • 둘 다 정수면 소수점은 버려진 뒤 결과가 나옵니다.
  • 소수 결과가 필요하면 최소 한쪽을 먼저 float로 바꿔야 합니다.

체크 질문 (스스로 답해보기)

  • int -> float(float&)a는 무엇이 다를까? (값 변환 vs 해석 변경)
  • 축소 변환에서 왜 손실이 생길 수 있을까?
  • hp / maxHp가 0이 되는 이유는?

profile
李家네_공부방

0개의 댓글