과제 요구사항
- 각 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로 변환
- input으로 char형이 들어온 경우 (= input의 길이가 1이면서 숫자가 아닌 경우)
Ex01
reinterpret_cast
주요 개념
reinterpret_cast
- 포인터와 관련된 타입 변환에 사용
- 사용 대상
- 포인터→포인터
- 포인터→일반 변수
- 일반 변수→포인터
- 변환 방식
- 해당 자료형의 비트 수에 맞게 채워진다.
- 포인터→char→포인터 와 같이 자료형의 크기가 다른 경우 주소값을 잃게 된다.
- nullptr이 됨.
- 포인터→char→포인터 와 같이 자료형의 크기가 다른 경우 주소값을 잃게 된다.
- 해당 자료형의 비트 수에 맞게 채워진다.
intptr_t , uintptr_t
- 포인터의 주소를 저장하는 용도로 사용
uintptr_t
intptr_t
과 다르게 명시적으로 캐스팅을 해주어야 한다.
과제 내용
- serialize : 내가 정의한 Data 구조체의 주소를 uintptr_t 타입 변수에 저장
- deserialize : 해당 변수를 다시 Data 포인터로 변환
- uintptr_t, Data* 모두 size가 8바이트이기 때문에 형변환 과정에서 데이터의 누수가 없다.
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이 될 수 없기 때문이다.