본문 바로가기
Development/C|C++|C#

[C++]static_cast와 C 스타일 캐스트의 차이

by True Life 2016. 9. 27.


C/C++ 프로그래밍 - static_cast와 C스타일 캐스트의 차이


C++는 1990년에 이미 가장 중요한 프로그래밍 언어가 되었습니다. 하지만 아직 C++의 OOP 부분(Class)만 사용할 뿐 구체적인 신기능들을 무시한체 기존 C언어 형태의 구기능을 계속 사용하는 경우가 많은것 같네요


그래서, 캐스팅에 대해서 알아보겠습니다. 캐스팅은 크게 두가지 분류가 있죠. 암시적(implicit)캐스팅과 명시적(explicit)캐스팅입니다. 여기서 살펴볼 부분은 명시적 캐스팅입니다.

C스타일 캐스팅과 C++ 캐스팅을 비교해 보겠습니다.


* C style * C++ style 


사실상 쓰임은 거의 비슷한데 왜 굳이 C++에서 저렇게 키워드를 하나 더 생성하면서까지 캐스팅을 내놓았을까요?

이에 대한 이유(장점)은 여러가지가 있습니다.


1. 컴파일러의 오류 체크

 - C++은 컴파일러가 캐스팅을 확인합니다. Error가 나도 컴파일러단에서 나기 때문에 추후 문제될 일을 미리 막을 수 있죠.


* static_cast (C++) - 컴파일단에서 에러 확인


* C style - 컴파일시 확인 불가 (1byte(char) → 4byte(int*)가 됨 : 추후 런타임 에러)


2. 총 4가지 형태(static_cast, dynamic_cast, const_cast, reinterpret_cast)가 있어 기능을 직관적 확인 가능




3. 보다 더 엄격(restrictive)함

 - 아래처럼 포인터 형변환이 안됩니다. 자료형 자체가 다르니 된다 한들 의미도 없습니다. (사실 그렇기 때문에 안되는게 맞는거죠) C스타일은 됩니다. 컴파일단에서 캐스팅을 전혀 신경 안쓰니까요. 포인터단에서 형변환이 의미 있는 경우는 상속받은 객체에 대한 업캐스팅, 다운캐스팅입니다.



* 여기서 다운캐스팅과 업캐스팅 간단하게만 짚고 넘어갈까요?

여기서 자식을 부모에게 할당하는 것을 업캐스팅, 부모를 자식에게 할당하는것을 다운캐스팅이라고 합니다. 

업캐스팅의 경우 자식(구체화된 객체)를 부모(보다 추상적인 객체)에 할당하니 큰 문제가 되지 않습니다. 이 포인터(부모형)를 통해 자식의 멤버에 접근할 수 없다는 것 말고는 자식들의 다형성을 보편화시켜 다룰 수 있다는 점 때문에 의미있게 사용되죠.

하지만 다운캐스팅의 경우 문제가 됩니다. 부모를 자식에게 할당할 경우 부모가 존재하지 않았던 값을 자식 포인터를 통해 접근할 수 있게 됩니다. 본래 있지도 않았던 값을 참조할 수 있다는 점에서 위험한 것이죠.


이 업캐스팅/다운캐스팅의 형 변환은 오류를 찾기 쉽지 않습니다. C스타일 캐스팅 뿐만 아니라 static_cast도 넘어가줍니다. 그래서 나온 캐스팅이 앞서 말씀드린 4가지 형태중 dynamic_cast 입니다.

업캐스팅/다운캐스팅을 위해 나온 캐스팅으로 다운캐스팅을 할 경우 null(0)을 반환해 위험함을 알립니다. 따라서 dynamic_cast시에는 값이 0이 아닌지 예외처리를 해야 합니다.


4. 키워드형태로 노출(작성)되어 있어 찾기가 편함 

 - 괄호로 찾는다고 할때 괄호가 어디 한두개인가요? 상상만 해도 편할 거라는 생각이 들죠? 특히 키워드이기 때문에 컴파일러에 따라 다르지만 색표시도 된답니다!


이렇게 새로나온 캐스트는 정말 큰 장점들을 갖추고 있답니다. 여기서는 C 스타일과 static_cast의 차이에 대해서만 알아보았고 나머지 const_cast와 reinterpret_cast는 다음번에 알아볼게요!