형변환이란
데이터 타입을 다른 데이터 타입으로 변경하는 것을 의미한다.
형변환 종류는 2가지인데
1. 묵시적 형 변환
사용자가 의도하지 않아도 컴파일러가 변환시켜주는것
2. 명시적 형 변환
사용자가 해당 자료형을 사용자가 지정한 자료형으로 변경하는것
묵시적 형변환 예시
void main()
{
int temp = 3.14;
cout << temp << endl;
}
실수형을 정수형에 넣을려고 한다. 해당 코드를 실행하게되면 3이 나오게된다.
이유는 컴파일러가 실수에 정수를넣을려고하니 실수를 자동적으로 정수로바꿔 소수점을 없애버린것이다.
명시적 형변환 예시
void main()
{
double value = 3.14;
int temp;
temp = (int)value;
cout << temp << endl;
}
해당 코드도 똑같이 실수를 정수 에 넣을려고하지만 이번에는 (int)를 적어 사용자가 실수를 정수로 double를 int
로 변경하라고 명시해주었다.
다만 이런방식의 형변환은 문제가있는데
int A;
float B;
A = (int)B; 이런식으로 형변환 하였으나 (Type)이 하는일이 너무 많아 명시적이지 못하다는 문제를 가지고있어
C++에서는 여러개의 형변환들이 나오게되었다
1. const_cast
const_cast는 이름처럼 Const를 형변환해주는 아이라고생각하면 편하다.
상용방법
const int A;
int B;
이렇게 2개의 변수가있고 A의 값을 변경할려고하지만 A의변수는 const이기때문에 값을 변경할수없다.
이럴경우에
B = const_cast<int>(A);
이렇게 해주면 B에다가 A의값을 넣어서 A대신 B의값을 이용하여 무언가를할수있게해준다.
const_case를할때 주의해야할점이있는데
const_cast는 형변환을 해주지 않는다. 그렇기때문에 int를 float로 const_cast하게되면 컴파일 에러가 발생하게된다.
2. static_cast
static_cast는 기본적으로 C에서의 형변환과 비슷하다.
사용방법
int A;
float B;
A = static_cast<int>(B);
이런식으로 해주면된다. 주의사항으로는 static_cast는포인터 타입을 다른것으로 변환하는것을 허용하지 않습니다. 하지만 상속 관계에 있는 포인터 끼리는 변환이 가능합니다.
3. dynamic_cast
dynamic_cast는 dynamic이란 말처럼 실행중에 형을 판단합니다. 또한 이 cast는 포인터 또는 참조 형을 캐스팅할때만 사용가능하고 호환되지 않는 자식형으로 캐스팅을하면 애러가나지않고 NULL포인터를 반환하게됩니다.
또한 상속관계의 virtual키워드의 함수가 정의가되어있는 경우에만 사용가능하다.
사용방법
Animal * myPet = new Cat();
Dog * myDog = dynamic_cast<Dog*>(myPet);
여기서 Dog와 Cat은 Animal을 상속받는상황이다.
하지만 위의경우 Dog가 Cat을 상속을받고있지 않기때문에 NULL값을 반환하게 될것이다 만약 저위 코드를 C스타일인
Dog * myDog = <Dog*>(myPet); 이렇게 할경우 컴파일 에러가 발생할것이다.
(위의 cast를 사용할때는 RTTI(실시간 타입정보, Real-Time Type Information)를 켜야한다.)
dynamic_cast는 무거운 cast방법이다. 사용할때는 항상 이것을 사용해야 하는지 고민을 많이하고 사용하여야 한다.
4. reinterpret_cast
reinterpret_cast는 임의의 포인터 타입끼리 변환을 허용하는 cast 연산자입니다.
이 cast는 신기하게 정수,실수형을 포인터 타입으로 cast할수있습니다.
사용방법
int A;
int * B;
B = reinterpret_cast<int *>(A);
위의 방법으로 하게되면 변수A의 값을 절대주소로 B한테 넘겨주게되는데 이 번지가 어느곳을 가리킬지 모르기 때문에 아주 위험한 cast방법이다. 위의 방식을 사용할때는 서로 데이터형이 맞다고 정말 확신할 때만 사용하기 바란다.
'C++' 카테고리의 다른 글
C++ 구조체(struct) (0) | 2020.07.20 |
---|---|
Inline함수 (0) | 2020.01.19 |
STL vector에서 push_back과 emplace_back의 차이점 (0) | 2019.12.04 |
C++ 가상 함수(Virtual),순수 가상 함수 , 가상 소멸자 (0) | 2019.10.17 |
Precompiled header(미리컴파일 헤더) (0) | 2019.09.04 |