본문 바로가기
프로그래밍 언어/C++

[C++] static_cast 사용 방법 및 필요성

by 까망 하르방 2025. 1. 26.
반응형

static_cast 필요성

C 언어에서도 type casing 가능하지만

논리적으로 위험한 캐스팅을 대부분 허용해서

개발자 의도 인지 실수 인지 구분하기 어렵다.

 

 

[예제 코드]

void* -> 다른 타입으로 캐스팅하는 것은

위험하기 보다 필요한 캐스팅에 해당 하다.

#include <cstdlib>

int main()
{
    // C Style
    int* p = (int*)malloc(sizeof(int) * 100);
    free(p);	
}

 

 

하지만

int* -> 다른 타입(double*) 캐스팅 하는 것은

4 Byte 할당한 곳에 8Byte 담는 것이기 때문에

의도치 않은 결과를 야기할 수 있다.

int main()
{
	int N = 100;
	double* p = (double*)&N;
	*p = 3.14;
}

static_cast

논리적으로 맞고, 반드시 필요한 경우만 캐스팅 허용

컴파일 타임에 형 변환을 해 주기 때문에

컴파일 시 타입 오류를 잡아 준다

#include <cstdlib>

int main()
{
	int* p1 = static_cast<int*>(malloc(100));// ok
	free(p1);

	int n = 100;
	// double* p2 = static_cast<double*>(&n); // error (허용 x)
}

 

 

static_cast<바꾸려고 하는 타입>(대상);

void* -> 다른 타입 포인터 (int*)

primitive type 간의 값 캐스팅

상속 관계 타입 캐스팅

사용자 정의 변환 연산자나 변환 생성자

 

 

[예제 코드] 상속 관계 타입

#include<iostream>
#include<cstdio>

using namespace std;

class Shape
{
private:
    int a;
public:
    Shape()
    {
        a = 10;
    }
    virtual void draw()
    {
        cout << "부모 draw" << endl;
    }
};

class Triangle : public Shape
{
private:
    int a;
public:
    Triangle()
    {
        a = 30;
    }
    void draw()
    {
        cout << "자식 draw" << endl;
    }
    void onlyTriangle()
    {
        cout << "까망 하르방 고유 함수" << endl;
        cout << a << endl;
    }
};

int main(void)
{
    // upcast
    Triangle t;
    Shape* ps = static_cast<Shape*>(&t);
    ps->draw();

    printf("\n-----------------------------------\n\n");

    // downcast
    Shape s;
    Triangle*  pt = static_cast<Triangle*>(&s);
    pt->draw();
    pt->onlyTriangle();
}

static_cast 상속

 

 

자식 클래스를 부모 클래스 타입으로 변수를 담을 수 있다.

부모 클래스를 자식 클래스로도 타입캐스팅을 허용하지만

멤버 함수를 부르면 예상값과 다르게 나올 수 있으니 주의

부모 클래스 인스턴스가 자식멤버함수 호출하면 의도치 않은 결과 초래할 수 있음

 

 

📌 [C++] const_cast 필요성 및 활용

 

[C++] const_cast 필요성 및 활용

const_cast 필요성C언어 캐스팅으로 const 주소를 받아서값을 다르게 해볼 수 있다.#include int main(){ const int c = 100; int* p = (int*)&c; *p = 5; std::cout   엄격한 제한을 두지 않는 C Style Casting 이기 때문에

zoosso.tistory.com

 

 

📌 [C++] reinterpret_cast 필요성 및 사용 방법

 

[C++] reinterpret_cast 필요성 및 사용 방법

reinterpret_castreinterpret_casttype_id>(expression);→ reinterpret_cast바꿀 타입>(대상); • 메모리 재해석 • 서로 다른 타입 주소 캐스팅 • 정수 ↔ 주소 사이 캐스팅 C++에서는 주로 static_cast 활용

zoosso.tistory.com

반응형

댓글