Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

README.md

CPP Module 06

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 범위 초과 처리