1. 값
두 숫자 자료형의 변환
- 값을 유지하려고 한다.
- 이진수 표기는 달라질 수 있다.
- 예시:
float
↔int
- 예시:
2. 개체 포인터
- 변수형 체크 후 부모 클래스를 자식 클래스로 변환다.
- 컴파일 시에만 체크할 수 있다. (정적)
- 실행 중에 크래시가 날 수 있다.
Animal* myPet = new Cat(2, "Coco");
Cat* myCat = static_cast<Cat*>(myPet);
Dog* myDog = static_cast<Dog*>(myPet);
myDog->GetDogHouseName();
Dog* myCat = static_cast<Dog*>(myPet);
- 컴파일은 된다. 컴파일러는 Animal과 Dog가 상속 관계임을 확인한다.
- 실행 중에 크래시가 날 수 있다. Dog 클래스의 멤버를 가지고 있지 않기 때문이다.
만약 Cat이 이름을 출력하는 메소드를, Dog가 주소를 출력하는 메소드를 갖고 있다면, 아래와 같은 일이 발생할 수 있다:
Animal* myPet = new Cat(2, "Coco");
Cat* myCat = dynamic_cast<Cat*>(myPet);
Dog* myDog = dynamic_cast<Dog*>(myPet);
myDog->GetDogHouseName(); // Cat의 이름이 출력될 수 있음
이는 두 클래스의 메소드가 함수 리스트 테이블에서 같은 위치에 있고, 해당 메소드가 참조하는 메모리의 오프셋이 Cat의 이름을 가리키고 있기 때문에 컴파일이 성공하고 실행 또한 가능할 수도 있다.
- 문제가 발생하지 않기 때문에 이런 경우 디버깅하기가 훨씬 어렵다.
Animal* myPet = new Cat(2, "Coco");
House* myHouse = dynamic_cast<House*>(myPet); // 컴파일 에러
House
와 Cat
은 상속 관계가 아니기 때문에 컴파일 에러가 발생한다.
'Language > C++' 카테고리의 다른 글
[C++] 27.Unmanaged Programming: const_cast (1) | 2024.01.30 |
---|---|
[C++] 26.Unmanaged Programming: reinterpret_cast (0) | 2024.01.30 |
[C++] 24.Unmanaged Programming: 형변환(Casting) (0) | 2024.01.30 |
[C++] 23.Unmanaged Programming: 인터페이스(Interface) (0) | 2024.01.30 |
[C++] 22.Unmanaged Programming: 추상 클래스 (0) | 2024.01.30 |