본문 바로가기

C++

C++의 Casting,형변환

형변환이란

데이터 타입을 다른 데이터 타입으로 변경하는 것을 의미한다.

 

형변환 종류는 2가지인데

1. 묵시적 형 변환

사용자가 의도하지 않아도 컴파일러가 변환시켜주는것

 

2. 명시적 형 변환

사용자가 해당 자료형을 사용자가 지정한 자료형으로 변경하는것

 

묵시적 형변환 예시

void main()
{
	int temp = 3.14;
	cout << temp << endl;
}

실수형을 정수형에 넣을려고 한다. 해당 코드를 실행하게되면 3이 나오게된다.

이유는 컴파일러가 실수에 정수를넣을려고하니 실수를 자동적으로 정수로바꿔 소수점을 없애버린것이다.

 

명시적 형변환 예시

void main()
{
	double value = 3.14;
	int temp;
	temp = (int)value;
	cout << temp << endl;
}

해당 코드도 똑같이 실수를 정수 에 넣을려고하지만 이번에는 (int)를 적어 사용자가 실수를 정수로 double를 int

로 변경하라고 명시해주었다.

 

다만 이런방식의 형변환은 문제가있는데

int A;

float B;

A = (int)B; 이런식으로 형변환 하였으나 (Type)이 하는일이 너무 많아 명시적이지 못하다는 문제를 가지고있어

C++에서는 여러개의 형변환들이 나오게되었다

 

1. const_cast

const_cast는 이름처럼 Const를 형변환해주는 아이라고생각하면 편하다.

상용방법

const int A;

int B;

이렇게 2개의 변수가있고 A의 값을 변경할려고하지만 A의변수는 const이기때문에 값을 변경할수없다.

이럴경우에

B = const_cast<int>(A);

이렇게 해주면 B에다가 A의값을 넣어서 A대신 B의값을 이용하여 무언가를할수있게해준다.

const_case를할때 주의해야할점이있는데

const_cast는 형변환을 해주지 않는다. 그렇기때문에 int를 float로 const_cast하게되면 컴파일 에러가 발생하게된다.

 

2. static_cast

static_cast는 기본적으로 C에서의 형변환과 비슷하다.

사용방법

int A;

float B;

A = static_cast<int>(B);

이런식으로 해주면된다. 주의사항으로는 static_cast는포인터 타입을 다른것으로 변환하는것을 허용하지 않습니다. 하지만 상속 관계에 있는 포인터 끼리는 변환이 가능합니다.

 

3. dynamic_cast

dynamic_cast는 dynamic이란 말처럼 실행중에 형을 판단합니다. 또한 이 cast는 포인터 또는 참조 형을 캐스팅할때만 사용가능하고 호환되지 않는 자식형으로 캐스팅을하면 애러가나지않고 NULL포인터를 반환하게됩니다.

또한 상속관계의 virtual키워드의 함수가 정의가되어있는 경우에만 사용가능하다.

사용방법

Animal * myPet = new Cat();

Dog * myDog = dynamic_cast<Dog*>(myPet);

여기서 Dog와 Cat은 Animal을 상속받는상황이다.

하지만 위의경우 Dog가 Cat을 상속을받고있지 않기때문에 NULL값을 반환하게 될것이다 만약 저위 코드를 C스타일인

Dog * myDog = <Dog*>(myPet); 이렇게 할경우 컴파일 에러가 발생할것이다.

(위의 cast를 사용할때는 RTTI(실시간 타입정보, Real-Time Type Information)를 켜야한다.)

dynamic_cast는 무거운 cast방법이다. 사용할때는 항상 이것을 사용해야 하는지 고민을 많이하고 사용하여야 한다.

 

4. reinterpret_cast

reinterpret_cast는 임의의 포인터 타입끼리 변환을 허용하는 cast 연산자입니다.

이 cast는 신기하게 정수,실수형을 포인터 타입으로 cast할수있습니다.

사용방법

int A;

int * B;

B = reinterpret_cast<int *>(A);

위의 방법으로 하게되면 변수A의 값을 절대주소로 B한테 넘겨주게되는데 이 번지가 어느곳을 가리킬지 모르기 때문에 아주 위험한 cast방법이다. 위의 방식을 사용할때는 서로 데이터형이 맞다고 정말 확신할 때만 사용하기 바란다.