C++
2014.08.04 14:59

Cast. 캐스팅. 형변환

조회 수 9615 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print

 A.   C의 캐스팅은 너무 위험해서 (비이성적, Unresonable) 그대로 사용 못함.

 1.   int a = 3;
int *p = &a;
double *p2 = (double*) p;
*p3 = 3.4;

 i.     이렇게 하면 메모리가 깨집니다. 이거 위험하죠

 2.   const int c = 10;
int* p = (int*)&c;
*p = 20;
cout << c << endl; - (1)
cout << *p << endl; - 20

 i.     (1) 10, (2) 20이 나옵니다.

 ii.    이유

 a. const int c = 10 하면 c 10인걸 알아요. 컴파일 타임에.
컴파일 시간 상수 compile time constant (↔ 런타임 시간 상수 runtime constant)

 b. 이 컴파일 시간 상수는 마치 매크로 처럼 c가 쓰인 곳은 10으로 치환되어 처리되는 것.

 B.   C++ 4가지 스타일의 캐스팅을 제공

 1.   static_cast : 안전하고 이성적인 캐스팅. void* => 다른 타입 가능. 그 외에는 연관된 타입만 가능

 2.   reinterpret_cast : 하위 수준의 캐스팅. 대부분 성공. 메모리의 재해석

 3.   const_cast : 객체의 상수성 제거

 4.   dynamic_cast : 안전한 다운 캐스팅. 실행시 높은 비용. RTTI 를 위한 캐스팅

 C.   될 수 있으면 static_cast 를 사용하세요





-const_cast

const로 선언된 상수를 일반변수로 변환하는데 사용된다. volatile를 변환시키는데도 쓰인다

 

-static_cast

c캐스팅과 비슷한 기본적인 캐스팅 연산자로 실수형, 정수형, 열거형등 기본적인 형변환을 할때 사용된다

const_cast와 달리 일반변수를 상수로 바꿀수있지만 상수를 일반변수로 바꾸진못한다

c캐스팅과의 차이점은 타입체크를 run-time으로 하지않고 compile-time에 정적으로 수행한다

 

-reinterpret_cast

어떠한 정수와 포인터 타입간에도 변환이 가능한 강력한 형변환이다

하지만 기본적인 캐스팅개념에서 벗어나 강제로 바꿔 매우 불안정하기 때문에 쓰려면 위험을 감수해야한다

 

-dynamic_cast

상속관계에있는 클래스간의 형변환을 할때 사용한다

형변환에 문제가없는지 안전검사도하는데 문제가 있을시에는 NULL값을 리턴하거나 예외를 띄운다

가상함수가 없는 클래스는 사용할 수 없다




1. static_cast

    - 묵시적 캐스트로 일반 변수형을 반환해준다.

 

간단한 예)

 

int d = 65;

char ch = d;                                            //컴파일러가 묵시적으로 캐스팅을해줌
char ch = static_cast<char>(d);               //static_cast를 해도  무방

 

묵시적 캐스팅과의 차이점


- 클래스 포인터에 대해 묵시적 캐스트는 is-a 관계가 성립하는 경우만 허용하고

static_cast는 is-a 관계뿐만아니라 상속관계일때도 캐스팅을 해준다.

 

Truck* pTruck = new Car;

Truck* pTruck = static_cast<Truck*>(new Car);

 

 명시적 변환이기는 하나 컴파일 타임에 타입 체크를 하는 등 대체적으로  안전한 형변환 이다.


2. reinterpret_cast


 일반적으로 허용하지 않는 위험한 형변환을 할때 사용한다.

단지 안의 있는 비트열만 보고 원하는 형으로 강제 변환을 할때 사용한다.

포인터를 정수로 변환하는 작업을 사용할때 많이 사용한다.

 

간단한 예)


int a, b;
a = reinterpret_cast<int>(&b);


3. dynamic_cast

 

 - 유일하게 c스타일의 형변환으로 불가능한 캐스팅.

상속관계에 있는 클래스의 형변환을 수행하며. 동시에 안전한지 검사 한다.

 

간단한 예)


Truck* pTruck = new Car;

Truck* pTruck = dynamic_cast<Truck*>(new Car);


4. const_cast

 

const 속성이나 volatile속성을 해제 할때 사용한다.

 

변수를 정의할때 volatile 키워드를 사용한다.

 

즉 상수로 정의한 변수를 변경하고 싶을때 사용한다.


간단한 예)


RECT rectA;

CONST RECT rectB;

rectA = const_cast<RECT>(rectB);



Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
371 LINUX 명령어 뒤의 옵션 자동완성 기능, complete 명령어 2015.01.06 8969 0
370 Pi NodeMCU PIN 정보 file 2017.01.09 9038 0
369 LINUX 리눅스 명령행에서 메일 보내기(send mail from linux command line) 2019.11.25 9054 0
368 C# Download Files from Web [C#] 2014.09.11 9083 0
367 Pi 라즈베리파이를 크롬캐스트 처럼 사용하는 방법 - RaspiCast 2017.10.17 9088 0
366 Pi ATTINY85 PIN정보, Data sheet 2 file 2016.12.10 9216 0
365 일반 사용하지 않는 COM Port 삭제하기 2015.03.18 9254 0
364 Pi 라즈베리파이 PI CAMERA 설치하기 2018.04.24 9274 0
363 일반 Html에서 사용하는 contentType의 종류 2015.10.27 9281 0
362 Android adb 를 이용한 터치 이벤트 보내기 2014.07.30 9315 0
361 PHP GD 라이브러리 간단 2014.07.09 9383 0
360 업무 마이크로 버블 Micro Bubble 이란 2016.08.29 9392 0
359 Android 에러 넘버 ErrorNo in Linux 2014.10.14 9434 0
358 Python distutils 개요 2014.04.24 9472 0
357 Android 약정 벗은 안드로이드, 서버가 되다 2014.05.09 9595 0
목록
Board Pagination ‹ Prev 1 ... 5 6 7 8 9 10 11 12 13 14 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5