Home CPP Module 06 : 타입 변환
Post
Cancel

CPP Module 06 : 타입 변환

과제 요구사항

  • 각 ex마다 하나의 형변환을 사용해야 하며, 해당 형변환을 사용한 이유를 설명할 수 있어야 한다.

핵심 개념

타입 변환 (type conversion)

  • 종류
    • static_cast
    • const_cast
    • reinterpret_cast
    • dynamic_cast
  • static_cast
    • 기본 형태
      • static_cast<new_type>(value);
    • 특징
      • 형변환 방법을 컴파일러가 아는 경우
  • const_cast
    • 기본 형태
      • const_cast<new_type>(value);
    • 용도
      • 일시적으로 const 지정 또는 해제
  • reinterpret_cast
    • 기본 형태
      • reinterpret_cast<new_type>(value);
    • 특징
      • 자료를 재해석하여 형변환하는 것
      • 주로 포인터, 참조자에 사용
  • dynamic_cast
    • 기본 형태
      • dynamic_cast<new_type>(value);
    • 특징
      • 상속 관계 중 다형성을 사용할 수 있는 경우 up, down 형변환

Ex00

주요 개념

static_cast

스칼라 타입 vs 컴포지트 타입

  • 데이터 타입의 종류
  • 스칼라 데이터 타입(scalar data type)
    • 하나의 값만 저장하는 데이터 타입
    • 예시) double, float, int, bool
  • 컴포지트 데이터 타입(composite data type)
    • 두 개 이상의 값을 저장할 수 있는 데이터 타입
    • 예시) struct

Nan, Inf

  • 부동 소수점 연산에 존재하는 특수한 값
  • Nan
    • Not-a-Number(수가 아닌 값)
    • 연산이 정의되지 않은 경우
    • 예시
      • 0을 0으로 나누는 경우
      • 음수의 제곱근을 구하는 경우
  • Inf
    • Infinity (무한대)
    • 연산이 overflow를 발생시키는 경우
    • 예시
      • 수를 0으로 나누는 경우

함수 설명

  • atof
    • 기본 형태
      • double atof (const char* str);
    • 동작
      • const char* 타입의 문자열을 받아서 double형으로 변환
    • 매개변수
      • str : 변환하려는 문자열
  • strtod
    • 기본 형태
      • double strtod (const char* str, char** endptr);
    • 동작
      • const char*형태의 문자열을 double형으로 변환
    • 매개변수
      • str : 변환하려는 문자열
      • endptr : 실수를 계산한 다음 위치의 문자열

과제 구현

  • 동작 과정
    • input으로 char형이 들어온 경우 (= input의 길이가 1이면서 숫자가 아닌 경우)
      • 해당 int를 문자열로 변환 후 input에 저장
    • char
      • ASCII 코드 범위 (0~127)인지?
      • printable한지?
    • int
      • nan 또는 inf가 아닌지?
      • 오버플로우가 아닌지?
      • static_cast
    • float
      • strtof로 변환
      • inf인가?
        • 부호 명시적으로 표시하기(std::showpos)
      • 리턴값이 소숫점을 포함한 형태인가? (floor 함수 활용-내림 함수)
        • 뒤에 .0f 또는 f 붙이기
    • double
      • strtod로 변환

Ex01

reinterpret_cast

주요 개념

reinterpret_cast

  • 포인터와 관련된 타입 변환에 사용
  • 사용 대상
    • 포인터→포인터
    • 포인터→일반 변수
    • 일반 변수→포인터
  • 변환 방식
    • 해당 자료형의 비트 수에 맞게 채워진다.
      • 포인터→char→포인터 와 같이 자료형의 크기가 다른 경우 주소값을 잃게 된다.
        • nullptr이 됨.

intptr_t , uintptr_t

  • 포인터의 주소를 저장하는 용도로 사용
  • uintptr_t
    • intptr_t 과 다르게 명시적으로 캐스팅을 해주어야 한다.

과제 내용

  • serialize : 내가 정의한 Data 구조체의 주소를 uintptr_t 타입 변수에 저장
  • deserialize : 해당 변수를 다시 Data 포인터로 변환
  • uintptr_t, Data* 모두 size가 8바이트이기 때문에 형변환 과정에서 데이터의 누수가 없다.
    • 만약 Data의 주소값을 char형으로 변환한다면?

      Untitled

      • 크기가 작은 데이터형으로 변환하기 때문에 컴파일 타임에 에러가 발생

Ex02

dynamic_cast

주요 개념

dynamic_cast

  • 기반, 파생 클래스 간에 포인터와 참조자를 변환하는 용도로 사용
  • 변환이 실패한다면?
    • 포인터로의 변환 : null 포인터를 반환한다.
    • 참조자로의 변환 : std::bad_cast 형태의 핸들러로 exception을 던진다.

과제 구현

  • identify pointer
    • dynamic_cast의 반환값이 NULL인지 확인
  • identify reference
    • try절 안에서 dynamic_cast를 실행했을 때 exception이 발생했는지 확인

평가 후기

  • long long 자료형의 버전 문제
    • -pedantic 플래그로 컴파일하여 확인할 수 있다.
  • dynamic_cast가 참조자 변환에 실패한 경우와 포인터 변환에 실패한 경우의 처리가 다른 이유
    • 참조자는 포인터와 다르게 null이 될 수 없기 때문이다.

Ref.

This post is licensed under CC BY 4.0 by the author.

CPP Module 05 : 예외 처리

CPP Module 07 : 템플릿