형 변환 연산자 사용 방법
C & C++ 관련 :
2007. 5. 5. 18:57
반응형
형 변환 연산자 사용 방법
이 문서는 응용 소프트웨어 개발팀이 앞으로 개발할 때 지켜야될 코드 컨벤션 규칙들 중에서 형 변환에 대해서 언급하고 있습니다.
이전까지 코딩에서 형 변환이 필요할 때 대부분 다음과 같이 코딩했습니다.
int a = 65;
char c = (char)a; // ok
위와 같은 형 변환 수행은 C 언어에서 제공하는 형 변환으로서 C++ 언어에서도 적합하게 동작합니다.
그러나 앞으로의 개발은 C++ 언어이고 C++ 언어에서는 OOP 개념과 함께 그에 수반할 수 있는 다양한 형 변환 연산자를 제공합니다.
C++ 언어에서는 다음과 같은 새로운 형 변환 연산자를 제공합니다.
static_cast
static_cast 연산자는 묵시적(implicit)으로 변환될 수 있는 데이터 형으로 변환을 시도할 때 유효한 연산자입니다.
일반적으로 다음과 같은 표현은,
static_cast<type-name>(expression!)
type-name이 expression!이 가지는 데이터 형으로 묵시적으로 변환 될 수 있을 때에만 유효합니다. 그렇지 않은 경우에는 에러가 발생합니다.
일반적으로 다음과 같은 표현은,
static_cast<type-name>(expression!)
type-name이 expression!이 가지는 데이터 형으로 묵시적으로 변환 될 수 있을 때에만 유효합니다. 그렇지 않은 경우에는 에러가 발생합니다.
<Example> class A { ... }; class B : public A { ... }; class C { ... }; A a; B b; A *pa = static_cast<A *>(&b); // ok B *pb = static_cast<B *>(&a); // ok C *pc = static_cast<C *>(&b); // error : C 클래스와 B 클래스는 관련이 없다
참고로 열거값은 데이터 형 변환이 없어도 정수 값으로 변환 할 수 있기 때문에, static_cast를 사용하여 정수 값을 열거 값으로 변환할 수 있습니다. 마찬가지로 static_cast를 사용하여 double 형을 int 형으로, float 형을 long 형으로, 그 밖의 다른 수치 변환들도 처리할 수 있습니다.
dynamic_cast
dynamic_cast 연산자는 가능하다면, 기초 클래스 형을 지시하는 포인터로부터 파생 클래스 형을 지시하는 포인터를 생성합니다. 만약 가능하지 않다면, 널 포인터인 0을 리턴합니다.
일반적으로 다음과 같은 표현은,
dynamic_cast<Type *>(pt)
포인터 pt에 의해 지시되는 객체(*pt)가 Type형이거나, Type형으로부터 직접 또는 간접적으로 파생된 객체일 경우에 포인터 pt를 Type 형의 포인터로 변환합니다. 그렇지 않을 경우에 이 표현은 널 포인터인 0으로 평가됩니다.
다음은 dynamic_cast의 몇 가지 예를 보여줍니다.
일반적으로 다음과 같은 표현은,
dynamic_cast<Type *>(pt)
포인터 pt에 의해 지시되는 객체(*pt)가 Type형이거나, Type형으로부터 직접 또는 간접적으로 파생된 객체일 경우에 포인터 pt를 Type 형의 포인터로 변환합니다. 그렇지 않을 경우에 이 표현은 널 포인터인 0으로 평가됩니다.
다음은 dynamic_cast의 몇 가지 예를 보여줍니다.
<Example 1> class A { ... }; class B : public A { ... }; class C : public A { ... }; class D : public B, public C { ... }; void foo() { D *pd = new D; A *pa = dynamic_cast<A *>(pd); // error : ambiguous B *pb = dynamic_cast<B *>(pd); // first cast to B A *pa2 = dynamic_cast<A *>(pb); // ok : unambigurous } <Example 2> class B { ... }; class D : public B { ... }; void f() { B* pb = new D; // unclear but ok B* pb2 = new B; D* pd = dynamic_cast<D*>(pb); // ok: pb actually points to a D ... D* pd2 = dynamic_cast<D*>(pb2); //error: pb2 points to a B, not a D // pd2 == NULL ... }
reinterpret_cast
reinterpret_cast 연산자는 어떠한 포인터 타입이라도 다른 어떠한 포인터 타입으로 형 변환 할 수 있습니다. 이 연산자는 Low-Level 프로그램에서 유용하게 사용할 수 있도록 제공하는 연산자입니다. 사용하기는 편하지만 그 만틈 안전성과 이식성을 보장하지 못합니다.
사용방법은 다음과 같습니다.
reinterpret_cast<Type *>(pt)
참고로 const, volatile 그리고 __unaligned 속성이 있는 데이터 타입에는 사용 할 수 없습니다. 만약 이러한 속성을 제거하기 위해서는 const_cast를 사용하세요.
사용방법은 다음과 같습니다.
reinterpret_cast<Type *>(pt)
참고로 const, volatile 그리고 __unaligned 속성이 있는 데이터 타입에는 사용 할 수 없습니다. 만약 이러한 속성을 제거하기 위해서는 const_cast를 사용하세요.
const_cast
const_cast 연산자는 데이터 형의 const, volatile 그리고 __unaligned 속성을 일시적으로 제거합니다.
사용방법은 다음과 같습니다.
const_cast<Type *>(pt)
다음 예제는 const_cast 연산자의 특성을 보여줍니다.
사용방법은 다음과 같습니다.
const_cast<Type *>(pt)
다음 예제는 const_cast 연산자의 특성을 보여줍니다.
#include <iostream> using std::cout; void change(const int *pt, int n); int main(void) { int pop1 = 38383; const int pop2 = 2000; cout << "pop1, pop2: " << pop1 << ", " << pop2 << 'n'; change(&pop1, -1); change(&pop2, -1); cout << "pop1, pop2: " << pop1 << ", " << pop2 << 'n'; return 0; } void change(const int *pt, int n) { int *pc; if (n < 0) { pc = const_cast<int *>(pt); *pc = 100; } }
위의 예제의 실행 결과는 다음과 같습니다.
pop1, pop2: 38383, 2000
pop1, pop2: 100, 2000
반응형
'C & C++ 관련' 카테고리의 다른 글
realloc 연습 (0) | 2007.05.09 |
---|---|
isspace 함수 - 공백문자 지우기 (0) | 2007.05.05 |
C 문법중 getline이 돌아가는 것이 이해가 안됩니다. (0) | 2007.05.05 |