IT Language 연습실
C++ 스타일에 맞는 형변환 본문
c스타일, cpp 스타일 다 통털어서 모든 형변환은 원본의 형이 바뀌는게 아니라 거기 형변환을 하는 문장에서만 유효.
형변환 연산자 ( dynamic_cast , static_cast , const_cast, reinterpret_cast, bad_cast)
dynamic cast 상속관계에서 안정성을 컴파일러가 보장하며 바꾸는 형변환 연산자.
(유도클래스의 포인터나 참조 데이터들을 기초 클래스의 형으로 변환한다.)
근데 dynamic cast가 기초 클래스의 포인터나 참조데이터들을 유도클래스의 형으로 변환하고 싶다면 다음의 조건을 만족해야 한다.
기초클래스의 하나 이상의 가상함수가 생성이되어 Polymorphic 클래스라는 사실을 명시해줘야 한다.
(Polymorphic 클래스 - 하나 이상의 가상함수를 갖고 있는 클래스) (추상화 클래스 - 하나 이상의 순수 가상함수를 갖고 있는 불완전한 클래스, 객체생성불가)
기초클래스의 포인터 가 가리키는 것이 동적할당된 기초클래스의 객체 주소일 경우
또 그런 기초클래스의 포인터를 유도클래스의 포인터 형으로 변환하려는 경우 유도클래스는 기초클래스의 주소를 받거나 참조 할 수 없다 따라서 NULL값이 반환된다.
static cast 기본 자료형이나 상속관계에 있는 객체들을 대상으로 형변환을 진행하는 연산자.
(상속관계에서 유도클래스의 포인터나 참조 데이터들의 형 변환 뿐만 아니라 기초클래스의 포인터나 참조 데이터들을 유도클래스로 바꿀 수도 있다.)
(기초클래스의 포인터가 가리키는게 유도클래스의 데이터라면 기초클래스의 포인터를 유도클래스로 바꿀 수 있고
기초클래스의 포인터가 가리키는게 기초클래스의 데이터라면 기초클래스의 포인터를 유도클래스로 바꿀 수 있다.
즉 그에 따른 책임은 개발자가 지게 된다.)
static_cast 가 dynamic_cast 보다 빠른 이유는 dynamic_cast는 안정적으로 형변환을 진행시키기 위해 컴파일러가 컴파일 이전에 안정성 검사를 위한 바이너리 코드를 생성한뒤 컴파일을 진행하는 과정을 겪어 실행 결과의 속도가 느리다.
하지만 static_cast 는 그러한 안정 여부와 상관없이 형변환을 시키기 때문에 그로인한 책임은 개발자가 지게 되는 것이다. 따라서 실행속도는 빠르다는 장점이 있다.
그렇기 떄문에 static이 dynamic 보다 빠른 이유이다.
const_cast : const를 제거.
보통 함수의 인자를 전달하는 과정에서 const로 선언된 변수를 함수의 인자로 전달하는 과정에서 전달 받을때 const가 없다면 전달 받을 수 없다.
const의 영향으로 형이 불일치하기 때문에 하지만 이떄
const_cast를 사용해서 const를 제거하여 보낸다면 자료형의 일치로 함수의 인자로 전달도 되고 받을 수도 있게 된다.
하지만. 그렇게 전달 받은 과정에서 만약 참조자나 포인터로 받았다면 메인에서 const로 선언된 변수의 값이 바뀔 수 있게 된다.
reinterpret_cast : reinterpret 단어 뜻 자체가 재해석, 새롭게 해석하다 라는 뜻을 갖고 있음. (포인터형과 관련된 거)
bad_cast : 프로그래머가 발생시킨 예외가 아닌 발생된 예외. dynamic 을 참조자로 사용하는 과정에서 발생될 수 있다.
dynamic_cast로 형변환을 진행하는 과정에서
Polymorphic 클래스라고 가정하에 기초 클래스를 객체를 하나 생성하고 그렇게 생성된 기초클래스의 객체를 참조할 수 있는 참조가 객체를 하나 만들고
참조자 객체를 유도클래스의 형으로 변환하려고 하는 과정이다. 하지만 유도클래스는 기초클래스 객체의 주소를 받을 수도 참조할 수 없다.
만약 포인터였다면 NULL 값을 반환하겠지만 참조자일 경우에는 NULL값을 반환하지 않는다.
이때 자동으로 throw 없이 자동으로 예외가 던져지는데 이것이 bad_cast이다.
따라서 참조형으로 dynamic_cast를 진행하려고 한다면 bad_cast 를 고려해서 사용해야 하며 그렇기 때문에 try{ } catch (bad cast 변수) { } 예외처
'C++' 카테고리의 다른 글
고용, 정규, 영업, 임시직 관련 된 클래스 만들기 (0) | 2024.02.25 |
---|---|
C++ 공부하면서 정리한 것들 (0) | 2024.02.25 |
template (4) 클래스 ver (0) | 2024.02.23 |
스마트 포인터 (Smart Pointer) (0) | 2024.02.22 |
template 파일 분할. (0) | 2024.02.22 |