[C/C++] Dynamic Cast, Static Cast

그림자왕국·2020년 9월 14일
1

업 캐스팅 (부모를 대상)

업 캐스팅은 부모 클래스를 대상으로하는 부모 클래스에 자식 클래스를 대입하는 캐스팅이다.
업 캐스팅은 다음 예제와 같이 사용할 수 있다.

Weapon * w = (Weapon*)new Gun(); 

또는

Gun * g = new Gun();
w = (Weapon*)g;

를 통해 업 캐스팅을 수행할 수 있다.


다운 캐스팅 (자식을 대상)

다운 캐스팅은 업 캐스팅의 반대이며 자식을 대상으로 사용하며 일반적으로는 사용할 수 없다.

Weapon* w = new Weapon();
Gun* g = (Gun*)w; // RunTime Error 발생!

부모 객체는 자식 클래스의 멤버가 존재하지 않기 때문에 런타임 에러가 발생할 것이다.
그래서 다운 캐스팅은 자식을 할당받은 부모를 대입 값으로 할 때 유효하다.

Weapon * w = new Gun();
Gun * g = (Gun*)w; // or dynamic_cast<Gun*>(w)

먼저 w가 Gun을 동적할당 했기에 g가 w를 다운 캐스팅해도 에러가 발생하지 않는다.


다형성

부모 클래스가 자식 클래스를 동적할당 하는 경우는 주로 다형성을 구현하기 위해 사용된다.
예를 들어 Weapon 이라는 클래스가 있고 자식 클래스로 Gun, Knife, Knuckle 등을 만들었다고 가정하자. Weapon 클래스는 그 자체로는 추상적이지만 상속을 통해 자식 클래스를 동적할당 함으로써 무기의 종류를 선택할 수 있다. 하지만 자료형 자체가 부모 클래스로 지정되어있기 때문에 자식 클래스를 동적할당 한다 쳐도 컴파일러 문법에 의해 자식 멤버 변수에 직접 접근할 수 없다.

Weapon * w = new Gun();
w->Bang(); // Compile Error! 문법 오류 발생 (Weapon 자료형에는 Bang() 함수가 없음)

자식 클래스의 멤버에 접근하려면 override 된 함수를 통해서만 접근해야 한다.

Dynamic_cast / Static_cast

다이나믹 캐스팅과 스태틱 캐스팅은 다운 캐스팅시 유용하게 쓰이는 C++11 함수이다.

먼저 Dynamic_cast는 런타임 중에 캐스팅 관계에 대해 검사(RTTI)를 해서 캐스팅이 유효하다면 통과시키고 불가능하다면 0(NULL)을 반환시킨다. 그래서 NULL값인지 유무를 보고 코드를 진행시킬 수 있어서 에러를 미리 방지하게 해준다.

Static_cast는 런타임이 아닌 컴파일 타임에 캐스팅을 검사하는데 Dynamic_cast보다는 비엄격하지만 캐스팅 시간이 낮아서 성능의 이점이 있고 그래도 C스타일의 캐스팅보다는 엄격하기에, 포인터로 const 변수를 변경하려는 꼼수 등을 방지하게 해준다. 즉 왠만하면 C스타일보다 Static_cast를 사용하는 것이 더 유효하다.

예제

해당 구문의 결과는 다이나믹 캐스트가 null을 반환하여 else 문이 수행된다.

profile
언리얼 엔진 매니아입니다.

0개의 댓글