티스토리 뷰

언어

C++ 타입 그리고 캐스팅 방법

jazzmaster 2019. 6. 6. 22:07

면접 공부하면서 글을 쓰는거라 내방식 대로 서술함. 다소 두서가 없을 수 있음.

 

 

 

1. typedef 

: 새롭게 타입을 만들지 않고, 이미 정의된 타입에 또다른 이름을 부여하는 것(참조와는 다름)

: ex) typedef double* d_ptr;  --> double* 타입에 또 다른 이름인 d_ptr을 부여함.

: ex) d_ptr attack;    --> double* 형의 attack이라는 변수

 

1.1 typedef를 쓰는 경우는 언제일까? 

: 이름이 너무 길 때, 간편하게 쓸 수 있음

: ex) void ProcessPacket(const std::vector<std::string>& val); 

: 위의 ProcessPacket이라는 함수의 파라미터는 단 하나인데, 엄청나게 길다 .... 이럴 때 쓰면 좋다.

: typedef std::vector<std::string> StrVector;   --> 이렇게 선언해주면

void ProcessPacket(const StrVector& val); --> 이렇게 써줄 수 있다. 

 

 

 

 

 

 

2. typedef 와 using(타입 에일리어스)

 

타입 에일리어스는 typedef가 복잡해질때 유용하다.

:ex) typedef int (*func)(int,char,double); --> 이렇게 정의한 함수 포인터 정의가 있다고 가정하면

:     using func = int (*)(int,char,double);  --> 이렇게 좀 더 직관적으로 작성할 수 있다.

 

 

 

3. c++에서의 캐스팅

3.1 static_cast

: 가장 일반적인 캐스팅 방법 

: 포인터나 객체를 아무 상관도 없는 타입으로 캐스팅하는 것은 안됨. 가령  * -> int 뭐 이런게 안된다는 말

: 상속관계에서 객체를 업캐스팅 , 다운 캐스팅할 때 사용한다. 근데 이건 좀 위험하다. 

  생각해보라. 메모리 접근 에러가 일어 날 수 있다.(런타임에서 검사도 안함)

  런타임 검사가 되는 안전한 캐스팅을 하려면 dynamic_cast를 활용한다.

 

 

3.2 dynamic_cast

: 클래스 계층에 대한 런타임 타입 정보 검사를 수행함(RTTI)

: 내가 하려는 변환이 적합하게 클래스 계층간의 변환인지 확인 하는 것이다.

: 런타임 타입 정보들은 vtable에 저장 되므로, 이 타입 검사를 하기 위해서는

  하나 이상의 virtual 메서드가 반드시 있어야한다.

 

 

3.3 const_cast

 : const 변수의 상수 속성을 없애고 싶을 때 사용. 사실 이건 쓸일이 없어야 하는게 맞다. 이걸 써야 하는 상황이

   온다면 프로그램을 다시짜는.....읍읍

 

3.4 reinterpret_cast

: c++에서 통상적으로 허용하진 않지만 프로그래머가 강제적으로 변환해줄 수 있다.

: 주로 void* 의 타입과 같이 활용된다.

 

 

*참고 지식 : reinter_pret_cast 는 포인터형 --> int로도 변환이 가능하다.

근데 상당히 위험하다. 보통 나는 x64 맞춰놓고 프로그램을 개발하는데, 포인터는 64bit인데 그냥 int형은 32bit이다.

포인터를 int로 변환하면 절반이 날아갈 것이다. 그래서 가급적이면 이러한 변환은 안하는게 좋은거 같다.

 

 

 

 

 

 

3.5 캐스팅 상황별 정리

: const 속성을 제거 하고 싶다? --> const_cast

: 언어 자체에서 허용 되는 일반적인 변환을 하고 싶다?(가령 int - double)   --> static_cast

: 커스텀 생성자나 변환 연산자가 구현되어 있을 때 명시적으로 변환하고 싶다?  --> static_cast

: 같은 클래스 계층에 있는 서로 다른 클래스 객체의 포인터, 참조 간의 변화> --> dynamic_cast를 주로 사용하자 안전빵

: 전혀 관계없는 두 포인터 혹은 참조 간 변화는 ? --> reinterpret_cast

: 함수 포인터간의 변환 --> reinterpret_cast

 

 

 

 

 

 

 

 

 

 

 

 

 

'언어' 카테고리의 다른 글

C++ 초기화  (0) 2019.06.06
C++ 아주 헷갈리는 const 키워드  (0) 2019.06.06
C++ 이동 시맨틱  (0) 2019.06.06
C++ 참조 정리  (0) 2019.06.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함