Programming Language/C,C++

C++ 캐스트 연산자(Cast Operator)

TwinParadox 2018. 6. 23. 06:36
728x90

C언어에서의 캐스트 연산자는 아주 간단했다.



int a=10;

double d;

d=(double)a;



이러한 코드의 장점은 사용자가 원하는대로 변수 타입을 변경할 수 있어서 편리하고 코드를 유연하게 짤 수 있고 void* 같은 타입 때문에 필연적으로 사용해야 할 때 사용할 수 있다는 점이다.

변환 가능성을 막론하고 작성한 코드 그대로 돌아가기 때문에, 그 자유로움이 프로그램의 안전성을 위협한다. 



C++에서는 이러한 캐스트 연산자의 단점을 보완하고자 네 가지의 캐스트 연산자를 도입했다.



static_cast

dynamic_cast

const_cast

reinterpret_cast



cast_operator<type> (var)



static_cast

강제 변환이 아닌 논리적으로 변환이 가능한 타입에 대해서 캐스팅 실시함.

일반적으로 실수형에서 정수형, 정수형에서 실수형 정수와 실수에 호환되는 enum 타입에 대해서는 변환이 가능.

일반 변수를 포인터 변수로, 포인터 변수를 일반 변수로 하는 것은 불가능함. 캐스팅을 시도하면 컴파일 에러.


상속관계에 있는 포인터에 대해서는 캐스팅이 가능하지만, 이 경우에도 부모 클래스에는 구현되어 있지 않은 기반 클래스의 멤버에 대해서 접근할 수 있는 문제가 여전히 남아 있음.



dynamic_cast

포인터는 포인터, 레퍼런스는 레퍼런스, 포인터끼리는 상속관계일 때 캐스팅 실시.

업캐스팅은 언제나 허용되지만 다운캐스팅에 대해선 안전한 경우에만 허용됨.



ex) Parent 클래스를 상속하는 Child 클래스

Parent*이지만, Child를 가리키는 경우에 Parent로 업캐스팅하는 것은 본래로 돌아가는 것.

Parent*이며 Parent를 가리키다가 Child를 가리키면 NULL을 반환함.



주로 상속관계의 포인터를 캐스팅에 사용하고 레퍼런스에 대해서도 사용할 수는 있음.

레퍼런스를 캐스팅에 실패하면 NULL이 반환되는 것이 아니라 bad_cast 예외가 발생하므로, try-catch로 처리해줘야 함.




const_cast

포인터의 constant 속성만 변경하고 싶을 때 사용하며, const 포인터를 constant 속성을 없애려고 할 때 사용함.

반대의 경우는 그저 대입하면 되기 때문에 굳이 const_cast를 사용할 필요는 없음




reinterpret_cast

임의의 포인터 타입끼리 사용할 수 있는 위험한 연산자.

정수형과 포인터 간에도 변경할 수 있으며 이 경우에는 절대 번지를 적용하기 위해 사용함.

기본 자료형 간에는 사용할 수 없음.




C++은 C에 비해서 제약을 많이 걸어두긴 했으나, 여전히 위험성을 가지고 있기 때문에 이러한 캐스팅 사용에 있어서는 주의를 해야 함.

728x90