[c++] Casting

파이톨치·2022년 5월 20일
1

대학수업

목록 보기
12/32

Casting

캐스팅이 뭐지?

캐스팅이 뭔지 궁금하면 대표적인 예시로 타입 캐스팅을 생각해볼 수 있다. 형 변환을 생각하면 된다.
이 그림을 보면 잘 이해가 된다.
코드를 살펴보면 다음과 같다.

Dog vdog;
Pet vpet;

Upcasting

vpet = static_cast<Pet>(vdog);
vpet = vdog; // 허용됨!

Downcasting

vdog = static_cast<Dog>(vpet); //허용하지 않음!

부모 자식 간에 캐스팅이 가능하다. 자식에서 부모로 가는 캐스팅은 쉽게 가능하지만 부모에서 자식으로 가는 캐스팅은 쉽지 않다. 왜냐하면 간단하게 생각해봐도 작은 공간에서 갑자기 큰 공간으로 갈 때 비는 공간이 있기 때문이다.
정보가 추가되어야 한다. 정적인 캐스팅에서는 불가능하다. 하지만 동적인 캐스팅은 가능하다고 한다. 그리고 앞에서 배웠던 가상 함수를 반드시! 사용해야 한다고 한다. 왜 가상 함수를 써야 하냐면 가상 함수도 동적으로 작동하기 때문이다. 허용되긴 하지만 조금 위험하다고 한다.

다음과 같이 사용한다.

Pet* ppet;
ppet = new Dog;
Dog *pdog = dynamic_cast<Dog*>(ppet);
Dog *pdog = static_cast<Dog*>(pet); //허용

동적인 캐스팅에서 핵심은 아무래도 포인터인 모양이다. 위에서는 Pet을 생성할 때 포인터로 생성하지 않았다는 점이 위 코드와 차별점이다. 되긴 하는데 굳이 쓰지 말라는 것 같다.

응용 vector

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	vector <int> v;
    cout << "Enter a list of positive numbers. \n"
    << "Place a negative number at the end. \n";
    
    int next;
    cin >> next;
    while(next >0)
    {
    	v.push_back(next);
        cout << next << " added. ";
        cout << "v.size() = " << v.size() << endl;
        cin >> next;
    }
    cout << "You entered: \n";
    for (unsigned int i = 0;i<v.size();i++)
    	cout << v[i] << " ";
    cout << endl;
    
    return 0;
}
profile
안알랴줌

0개의 댓글