C++ 타입 변환(Type Casting)을 학습하는 모듈입니다. static_cast, dynamic_cast, reinterpret_cast 등 다양한 캐스팅 방법과 직렬화를 다룹니다.
주요 학습 포인트:
- C++ 스타일 캐스팅
- static_cast, dynamic_cast, reinterpret_cast, const_cast
- 타입 변환의 안전성
- 직렬화/역직렬화 (Serialization)
- RTTI (Run-Time Type Information)
ex00: Conversion of scalar types
- ScalarConverter 클래스
- 문자열을 char, int, float, double로 변환
- 특수 값 처리: nan, +inf, -inf, +inff, -inff
- 불가능/표시 불가능한 변환 처리
- static 멤버 함수만 사용 (인스턴스화 금지)
ex01: Serialization
- Serializer 클래스
- uintptr_t를 이용한 포인터 직렬화
- serialize(): 포인터 → uintptr_t
- deserialize(): uintptr_t → 포인터
- reinterpret_cast 활용
ex02: Identify real type
- Base 클래스와 A, B, C 파생 클래스
- generate(): 랜덤하게 A, B, C 중 하나 생성
- identify(Base* p): 포인터로 타입 식별
- identify(Base& p): 참조자로 타입 식별
- dynamic_cast 활용
C++ 스타일 캐스팅의 장점
- C 스타일 캐스팅보다 명확하고 안전함
- 컴파일러가 타입 체크를 수행하여 오류 방지
- 코드의 의도를 명확하게 표현
static_cast
- 컴파일 타임에 타입 변환을 수행
- 기본 타입 간 변환, 상속 관계의 업캐스팅에 사용
- 다운캐스팅도 가능하지만 안전성 보장 없음
dynamic_cast
- 런타임에 타입 체크를 수행 (RTTI 필요)
- 다형성 클래스의 안전한 다운캐스팅
- 실패 시 포인터는 NULL 반환, 참조자는 bad_cast 예외 발생
reinterpret_cast
- 비트 패턴을 재해석하는 저수준 변환
- 포인터와 정수 간 변환, 서로 다른 포인터 타입 간 변환
- 플랫폼 의존적이며 위험하므로 신중하게 사용
const_cast
- const 또는 volatile 한정자를 추가/제거
- const 객체를 수정해야 하는 특수한 경우에만 사용
ScalarConverter (ex00)
- static 멤버 함수만 제공하여 인스턴스화 방지
- 문자열을 char, int, float, double로 변환
- nan, inf 등 특수 값 처리 및 불가능한 변환 표시
Serialization (ex01)
- reinterpret_cast를 사용하여 포인터를 정수형으로 직렬화
- uintptr_t 타입으로 포인터 값을 저장 후 복원
- 포인터 주소가 동일하게 유지됨을 보장
타입 식별 (ex02)
- dynamic_cast를 사용하여 런타임에 실제 타입 확인
- 포인터 버전: NULL 체크로 타입 판별
- 참조자 버전: bad_cast 예외를 이용한 타입 판별
c++ -Wall -Wextra -Werror -std=c++98 *.cpp -o converter각 exercise에서:
make- static_cast: 암묵적 변환만 허용, 안전하지만 런타임 체크 없음
- dynamic_cast: 다형성 클래스(가상 함수 필요)에만 사용 가능
- reinterpret_cast: 매우 위험, 플랫폼 의존적
- 캐스팅 최소화: 필요한 경우에만 사용
- 정밀도 손실: float/double 변환 시 주의
- 오버플로우: int 범위 초과 처리