개발자 면접 공부/C-C++

C++ 캐스팅의 종류

chogyujin 2022. 7. 14. 21:03
728x90

C++ 에는 4가지의 캐스팅이 있습니다. 그 캐스팅을 공부해봅시다.

 


캐스팅은 자료형간 또는 포인터간 형변환시 사용됩니다.

 

캐스팅은 크게 묵시적 캐스팅와 명시적 캐스팅 두 가지로 나눌 수 있습니다.

 

특별히 캐스팅 연산자를 사용하지 않고 이루어지는 경우를 묵시적 캐스팅이라고 합니다.

 


static_cast
static_cast
의 특성은 묵시적 캐스팅와 일치적으로 같다고 보면 됩니다.

묵시적 캐스팅에는 컴파일 시점에서 무결성 검사를 하는데 이떄 허용 과 컴파일러에 의한 값 변환 이라는 두 가지 관점에서 이루어 집니다.

 

컴파일 타임에서 제약사항은 에러를 발생시킵니다. static_cast는 형변환에 대한 타입체크를 run time 에 하지않고 compile 타임에 정적으로 수행합니다.

 

#include<iostream>

using namespace std;

class Car
{
public : 
	virtual void Open()
	{
		cout << "차문 개방" << endl;
	}
};

class BasicCar : public Car
{
public:
	void Open()
	{
		cout << "옆으로 열림" << endl;
	}
};

class SuperCar : public Car
{
public:
	void Open()
	{
		cout << "위로 열림" << endl;
	}
};

int main()
{
	Car* p = new Car();
	BasicCar* B = new BasicCar();
	p = static_cast<Car*>(B);
	p->Open();
}

const_cast

상수를 없애는 데 사용합니다.

int main()
{
	const int a = 5;
	a = 6; // 에러

	int* c = const_cast<int*>(&a);
	*c = 7; // 가능
}

reinterpret_cast

 

reinterpret_cast는 어떠한 포인터 타입으로 변환이 가능합니다.

 

어떠한 정수 타입도 어떠한 포인터 타입으로 변환이 가능하고, 그 역으로도 가능합니다.

 

char*->int 또는 int*에서 char* 로 변환이 가능합니다. 하지만 매우 위험부담이 큼니다.

 

강제로 형변환하는것은 어떠한 결과를 초래할지 모르기때문에 매우 위험합니다.

 

바이트 단위로 뭉텅이로 변환을 시도하기 떄문입니다.


dynamic_cast

 

dynamic_cast는 run time(동적으로)에 상속 계층 관계를 가로지르거나 다운캐스팅시 사용되는 캐스팅 연산자입니다.
기본 클래스 객체에 대한 포인터나 레퍼런스의 타입을 자식 클래스, 혹은 형제 클래스의 타입으로 변환 할 수 있습니다.

캐스팅의 실패시 NULL 혹은 nullptr 이 들어옵니다.

상속 관계는 있지만 만약 virtual 맴버 함수가 하나도 없다면 다형성을 가진게 아니라 단형성이며, dynamic_cast는

다형성을 띄지않은 객체간 변환은 불가능하며, 컴파일 에러를 발생합니다.

또한 RTTI에 매우 의존적으로 변환 비용이 매우 하드합니다.

 

#include<iostream>

using namespace std;

class Car
{
public : 
	virtual void Open()
	{
		cout << "차문 개방" << endl;
	}
};

class BasicCar : public Car
{
public:
	void Open()
	{
		cout << "옆으로 열림" << endl;
	}
};

class SuperCar : public Car
{
public:
	void Open()
	{
		cout << "위로 열림" << endl;
	}
};

int main()
{
	Car* C = new BasicCar();
	BasicCar* B = dynamic_cast<BasicCar*>(C);
	if (B)
	{
		B->Open();
	}
}

여기서 포인터 변수는 부모인 Car로 잡고 가르키는 즉 동적할당을해주는 것은 BasicCar()로 해줬는데 이유는

dynamic_cast를 하기위해 BasicCar에 생성자를 한번 호출해야하기 떄문입니다.

'개발자 면접 공부 > C-C++' 카테고리의 다른 글

(C,C++) L-Value, R-Value  (0) 2022.08.02
C++ 스마트 포인터(Unique, Shared, Weak)  (0) 2022.07.19
C++ RTTI 에 대해  (0) 2022.07.14
C++ 순수 가상 함수(추상 클래스)  (0) 2022.07.12
C++ Virtual(가상) 함수  (0) 2022.07.12