일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 스레드
- 혼자 공부하는
- dfs
- 지역변수
- 131701
- C++
- 그래프
- 장치컨트롤러
- 프로그래머스
- CPU 스케줄링
- BFS
- 인터럽트
- 혼자공부하는
- DirectX
- 독학
- 한빛미디어
- 컴퓨터 구조
- 멀티스레드
- Transform
- 렌더링 파이프라인
- 운영체제
- DDR SDRAM
- static
- 코딩테스트
- 보조기억장치
- 입출력장치
- 풀이
- 프로세스
- 컴퓨터구조
- 138477
- Today
- Total
빼미의 개발일기
[C++] - 캐스트 총정리 본문
캐스트는 자료형간 또는 포인터간의 형변환시 사용하며, 크게 묵시적 캐스트(Implicit Cast), 명시적 캐스트(Explicit Cast)로 나뉜다.
//ex)
int i = 10;
char c = i; // 묵시적 캐스트
char c = (char)i; // 명시적 캐스트 (C Style)
char c = static_cast<char>(i); // 명시적 캐스트 (C++ Style)
static_cast
- 정적 캐스트(static_cast)의 특성은 묵시적 캐스트와 1차적으론 같은 역할을 하고, 유효성 검사를 통해 변환의 유무를 판별한다.
◆ C Style Casting VS C++ Style Casting(static_cast)
- 두 경우의 가장 큰 차이점은 컴파일 과정에서 유효성 검사 과정의 유무이다.
double num = 3.14;
int result = (int)num;
C Style Casting은 단순히 데이터의 비트 패턴을 다른 데이터 타입의 비트 패턴으로 변환 하는 것이다. 때문에 데이터의 값이나 유효성 검사는 수행하지 않는다. 이는 컴파일러에 의해 처리되며, 컴파일 시점에서 수행되는 정적인 변환이기 때문에 런타임에는 캐스팅 과정이 일어나지 않는다.
static_cast<Type>(Expression)
C++ Style Casting (static_cast)의 경우에는 컴파일 시점에서 수행되는 정적인 변환이기 때문에 런타임에서 캐스팅 과정이 일어나지 않는다는건 C Style Casting과 동일하지만, 컴파일러가 표현식(Expression)에 지정한 변수의 타입을 Type으로 변환할 때 몇가지 유효성 검사를 수행한다. (예를 들면 정수에서 부동소수점으로 변환시 정밀도 손실이 발생할 수 있다는 경고를 출력하거나, 포인터 타입 간의 변환시 포인터의 const 손상이 유지되어야 하는 등)
const_cast
- const_cast는 간단히 표현식의 상수성(const)를 일시적으로 없애는 데 사용한다.
- 없애는 과정은 해당 코드가 일어나는 줄에서 일시적으로 해제되며, 영구적으로 없어지는 건 아니다.
(C Style Casting에서도 const를 제거할 수 있지만 지양한다. - char* Char = (char*)constChar)
reinterpret_cast
- reinterpret_cast는 어떠한 포인터 타입도 어떠한 포인터 타입으로 변환이 가능하다.
char* -> int* 또는 int* -> char* 또는 any_class* -> another_class*로도 가능하다
(하지만 특수한 케이스가 아닌 경우에는 사용하지 않는 것을 권함) - 포인터나 레퍼런스의 비트 패턴을 다른 타입으로 간단히 변환할 수 있는 연산자이다.
◆ 강력하면서도 위험한 연산자인데, reinterpret_cast는 컴파일러가 타입 검사를 수행하지 않고, 단순히 메모리의 비트 패턴을 다른 타입으로 해석해 버린다. 변환 관계에 높인 두 개체의 관계가 명확하거나, 특정 목적을 달성하기 위할 때만 사용하는 것이 바람직하다. 또한 적용된 후의 변환 결과가 컴파일러에 따라 다르게 정의될 수 있기 때문에 reinterpret_cast가 사용된 소스는 직접 다른 곳에 소스 이식이 불가능 할 수 있다.
dynamic_cast
- dynamic_cast는 런타임에 상속 계층 관계를 가로지르거나 다운캐스팅시 사용되는 캐스팅 연산자이다.
- 주로 소스타입의 포인터나 레퍼런스를 특정한 타입으로 캐스팅할 때 사용하며, dynamic_cast는 런타임에 객체의 실제 타입을 확인한다.
- 컴파일러는 소스 타입의 객체가 실제로 대상 타입의 객체인지 검사하기 위해 RTTI(Runtime Type Information)을 사용한다. RTTI는 C++의 객체 지향 프로그래밍에서 객체의 실제 타입 정보를 저장하고 런타임에 접근 할 수 있도록 하는 기술이다.
- dynamic_cast는 객체의 실제 타입과 대상 타입을 비교하여 만약 객체의 실제 타입이 대상 타입과 호환되지 않는다면 nullptr 나 NULL을 반환하기 때문에 안전성이 보장된다.
- dynamic_cast는 다형성을 지원하는 클래스 계층 구조에서, 특히 부모 클래스 포인터나 레퍼런스를 사용하여 실제 타입을 동적으로 확인하고 안전하게 캐스팅할 때 유용하다.
- 런타임때 타입 검사를 수행하므로, 성능에 영향을 미칠 수 있고, 동적으로 할당된 객체에 대해서만 타입 변환을 수행하고자 할 때 사용할 수 있다. (정적으로 할당된 객체나 기본 데이터 타입에 대해서는 사용 할 수 없다.)
◆ static_cast VS dynamic_cast (어떨 때 써야 할까?)
- static_cast
- 두 개의 상관 없는 타입 간의 타입 변환이 필요한 경우에 사용될 수 있다.
- 타입 변환에 따른 무시 가능한 경고를 받고자 할 때 사용될 수 있다.
- 다형성을 고려하지 않고, 단순한 타입 변환만 필요한 경우에 사용될 수 있다.
- dynamic_cast
- 다형성을 고려하여 객체의 실제 타입을 확인하고, 객체를 안전하게 캐스팅하고자 할 때 사용될 수 있다,.
- 동적으로 할당된 객체에 대해서만 타입 변환을 수행하고자 할 때 사용될 수 있다.
- 타입 변환에 실패 할 경우, nullptr 또는 NULL을 반환하여 타입 변환 실패를 처리하고자 할 때 사용될 수 있다. 동적 캐스팅은 런타임에 객체의 실제 타입을 검사하므로, 타입 변환에 실패 할 경우 이를 처리 할 수 있는 방법을 제공한다.
요약하면 정적 캐스팅은 단순한 타입 변환에 사용되고, 동적 캐스팅은 다형성을 고려하여 객체의 실제 타입을 확인하고 안전하게 타입 변환을 수행하고자 할 때 사용한다.
'프로그래밍 > C & C++' 카테고리의 다른 글
[C++] - extern 변수 (0) | 2023.05.23 |
---|---|
[C++] - Static (0) | 2023.05.16 |
[C++] - 지역, 전역, 동적 변수의 차이점 (0) | 2023.05.12 |
[C++] - 람다식 (1) | 2023.05.09 |