본문 바로가기
IT 컴퓨터_프로그램 /c++

캐스팅연산

by 건축직일상 2015. 10. 12.

캐스팅연산자.....


int iA = 3.1415;

이런식의 선언을 묵시적 선언이라고 한다

int iB = (int)3.1415;

이런식의 선언을 명시적 선언 이라고 한다


부동 소수점 형태에서 정수타입으로 묵시적인 형변환이 일어났다고 설명할수가있다


묵시적 형변환은 타입변환이 필요할때 우리가 따로 캐스팅(형변환) 을 안하면 

컴파일러에 의해서 자동으로 일어나는 것이다


float fA = 9695.244f;

int iC = fA ; // 묵시적 변환


캐스팅 문법에는 5가지가 있다 


1. static_cast


형변환을 해주는 연산자로서 논리적으로 가능한 캐스팅을 수행해 준다

class CParent

{

public:

int iA;

};


class CChild : public CParent

{

public:

int iB;

};

void main(void)

{

CParent*    p = new CParent;

CChild    p2 = p; // 상속에서 이런식의 대입은 불가능 하였다

//가능하게 하기위해서

CChild*    p2 = static_cast<Child*>(p);

p2->10; // 값변경이 가능하다


}

하지만 이방법이 안전한것은 아니다

일반적으로 short 에서 int 로 변환 float 에서 double 로 변환 같은 데이터 형식을 확실히 알고있을때 사용한다

이것이 캐스팅이 되는 시점에서 기계어 코드를 만드는 시점인데 기계어 코드를 만드는 시점이 컴파일 타임 (정적) 이기때문에 정적 캐스팅이된다

묵시적 캐스팅과 동일하며 안전하지 않다


2.dynamic_cast


다른 캐스팅연산과 다른놈이다 . 실행중에 형변환이 일어나며 실행중에 형변환의 대상이 되는 데이터를 능동적으로 판단하여

실행코드가 형변환을 수행하여 이형변환이 안전한것인지 판단해준다 

하지만 형변환에 실패하면 NULL 을 반환해준다


class A{};


class B{public: int m_iA;};

class C: public B {};

class D: public C {};


void main(void)

{

D*    pD = new D;

C*    pC = dynamic_cast<C*>(pD); // C가 D의 부모클래스 임으로 문제없다

B*    pB = dynamic_cast<B*>(pD); // B는 C의 부모 , D는 C의 자식

//B의 최하위 자식이 D이다

B* pB2 = new C;

//C* pC2 = dynamic_cast<C*>(pB2); // 원래의 형태인 C*로 형변환 하려하지만 불가하다


B* pB3 = new B;

//C* pC3 = dynamic_cast<C*>(pB3);


}

//자식클래스 포인터를 부모클래스 포인터로 캐스팅 하는것 - 업캐스팅

//부모클래스 포인터를 자식클래스 포인터로 캐스팅하는것 - 다운 캐스팅



3. const_cast


포인터 타입하고 참조형에 대해서만 사용한다


const    B*    pB4 = new B;

//B*    pB5 = pB4; //

//상수포인터를 일반 포인터 값에 대입시키려 하면 안된다


B*    pB5 = const_cast<B*>(pB4);

//const_cast 는 상수로 지시된 포인터를 비상수 지시포인터로 바꾸고 싶을때 사용한다


const 나 volatile 속성을 제거해야할때 사용한다


volatile - 컴파일하는데 최적화를 막아주는 방법 

코드가 사용될때 변수값이 바뀜없이 계속 반복 사용될때 이변수를 얻으러 메인메모리까지 가기가 귀찮아서 로컬 레지스터에 저장해놓는 일이있는데

그럴때 volatile을 사용하여 항상 메인 메모리에서 읽게 하여서 실행중에 인터럽트가 생기더라도 값이 바뀌지않게 할수가있다

한마디로 마음대로 최적화하지말고 항상 메인메모리에서 가져오게 하여라 라고 해주는것이다


4. reinterpret_cast


연관성이 없는 타입을 변환하기 위해서 사용한다


A*    pA = reinterpret_cast<A*>(pB2);

//이건 어떤 객체이든지 어떤 자료형이든지 단순비트열로만 판단하여 강제로 변환시킨다

// 이건 사용하지말자......


5. safe_cast


주로 런타임오류가 예외 상황을 나타낼때 사용한다 

safe_cast 주용도는 프로그램 테스트 시에 오류를 바로 식별하는것 이다

처리되지 않은 예외 오류 발생 시점을 나타내는 것으로 예외를 처리할 필요가없다 

캐스팅이 확실히 작동하는 경우에 사용한다 


잘모름.

'IT 컴퓨터_프로그램 > c++' 카테고리의 다른 글

오버라이딩_virtual2  (0) 2015.10.13
오버라이딩_virtual  (0) 2015.10.13
클래스_상속  (0) 2015.10.12
깊은복사 얕은복사  (0) 2015.10.06
static  (0) 2015.10.06

댓글