C++

C++의 캐스팅 - static_cast

monstro 2024. 4. 8. 02:07
728x90
반응형

저번 포스팅에서는 C 스타일 캐스팅과 C 스타일 캐스팅의 문제점을 알아보았습니다.

이번 포스팅에서는 C++의 캐스팅에 대해 알아보겠습니다.

 

구성은 다음과 같습니다.

 

  • static_cast
  • dynamic_cast
  • reinterpret_cast
  • const_cast

 

1) static_cast란?

static_cast는 가장 간단한 형태의 캐스팅입니다.

일반적으로 우리가 합당하다! 라고 생각하는 캐스팅 관계일 때 사용하게 됩니다.

그리고 static_cast는 컴파일 시점에서 이루어지게 됩니다.

거두절미하고 한번 보겠습니다.

 

2) 변수의 자료형 -> 변수의 자료형

int형에서 flaot형으로

 

int형에서 string형으로의 변환은 에러를 발생시킨다

 

위와 같이 static_cast는 캐스팅을 하되, 캐스팅의 관계가 애매모호한 경우에는 에러를 띄우는 것을 볼 수 있습니다.

 

2) 포인터의 자료형 -> 포인터의 자료형

int* 포인터끼리의 캐스팅

 

포인터끼리의 캐스팅은 내부 메모리가 아닌

포인터가 참조하고 있는 주소를 캐스팅하는 형태로 이루어진다고 말씀드렸습니다.

 

따라서 위 사진과 같이 p2는 기존에 참조하고 있던 b가 아닌 a를 참조하게 된 것을 확인할 수 있습니다.

 

포인터끼리의 캐스팅도 마찬가지로, 캐스팅 관계가 애매모호한 경우 에러를 통해 캐스팅을 막게 됩니다.

 

에러 발생!

 

3) 상속 관계에서의 static_cast

상속 관계에서의 캐스팅은 2가지로 정리할 수 있습니다.

  • 업캐스팅
  • 다운캐스팅

업캐스팅자식에서 부모로 이루어지는 관계이고,

다운캐스팅부모에서 자식으로 이루어지는 관계입니다.

 

동물의 분류표는 위에서 아래로 갈수록, 특징이나 행동양식이 다양해집니다.

마찬가지로, 상속 관계에서도 위에서 아래로 갈수록 메서드나 멤버 변수가 다양해지는 경우가 많습니다.

 

그렇다면 이러한 경우에 캐스팅은 어떻게 되는 걸까요?

 

클래스의 관계

 

위와 같은 클래스가 있습니다.

그리고 우리는 업캐스팅과 다운캐스팅으로 위의 클래스 간의 관계를 바꿔보려고 합니다.

 

코드와 실행결과

 

에러가 발생하지는 않았지만 결과가 완전히 뒤죽박죽으로 이루어져 있습니다.

이는 static_cast가 상속관계를 고려하지 못하고 작동하고 있음을 알 수 있습니다.

 

static_cast는 가장 심플한 캐스팅입니다. 그만큼 빠르고 효율적이지만, 고려하지 못하는 부분이 많습니다.

그리고 이러한 문제를 예방하고자 우리는 dynamic_cast를 상속관계에 사용하여 문제를 해결하고자 합니다.

728x90
반응형

'C++' 카테고리의 다른 글

C++의 캐스팅 - reinterpret_cast  (0) 2024.04.14
C++의 캐스팅 - dynamic_cast  (0) 2024.04.14
캐스팅 - C언어의 캐스팅  (0) 2024.04.07
virtual , override 키워드  (0) 2024.03.18
람다  (0) 2024.03.18