Introduction
C++은 기본적으로 type safe 하지 않다고 알려져 있습니다. 쉽게 말하면, 문법적으로 틀리지 않으면 의미적으로 문제가 있어도 컴파일러가 잡아주지 않습니다. C++ 수업을 처음 접한다면 얼마 지나지 않아 이를 직접 경험할 수 있습니다.
int array[4];
array[4] = 1;
이 코드는 문법적으로는 틀리지 않습니다. 또한, 처음 프로그래밍을 접하시는 분들에게는 직관적으로 다가올 수 있죠. 우리는 보통 0이 아닌 1부터 숫자를 카운팅 하니까요. 하지만 위 코드는 접근해서는 안될 영역에 값을 저장했기 때문에 에러를 발생시킬 확률이 존재합니다.
이런 점들을 기억하고 다시 type casting으로 돌아가 봅시다. Type casting은 변수나 함수의 parameter/return value를 다른 type으로 변경하는 것을 의미합니다. 그리고 Type casting은 C++ 프로그래머가 정확한 계획 하에 사용해야 합니다. 불친절한 컴파일러는 잘못된 형식 변환이 존재하더라도 경고를 띄워주지 않을 수 있거든요.
이제 본격적으로 type casting이 무엇인지 살펴보도록 하겠습니다. 이번 포스트에서는 type casting의 종류와 C++ cast operator들이 등장하게 된 계기인 C style casting의 문제점들을 소개하겠습니다. 각각의 casting에 대한 자세한 내용은 개별 포스트로 다룰 예정입니다. 아래에 개별 포스트들에 대한 링크를 게시물을 작성하는 대로 업데이트할 예정이니 많은 관심 부탁드립니다.
Type Casting의 종류
Type casting은 암시적(implicit) casting과 명시적(explicit) casting이 있습니다. 전자는 별도의 선언 없이 컴파일러가 형변환을 해주는 것입니다. 반대로 명시적 casting은 프로그래머가 형 변환을 위해 코드를 직접 작성하는 것을 의미합니다. C style casting이 C++에서도 사용되나, 몇몇 문제점을 보완하고자 cast operator 사용을 권장합니다. 기존 C style casting의 문제점은 아래에서 좀 더 살펴보겠습니다.
C style casting
C++의 cast operator들은 C style casting의 몇 가지 단점들을 개선하고자 등장한 키워드라고 생각하면 이해가 편할 것입니다. 그렇다면 C style type casting은 어떠한 문제점들이 있을까요? 우선 C style casting의 문법을 살펴보고 이어서 문제점들을 짚어보겠습니다.
int main(){
float myFloat = 0.8;
(int)myFloat; // C style casting example #1
int(myFloat); // C style casting example #2
return 0;
}
- 컴파일러 오류 방지 불가
우선 컴파일러가 오류를 사전에 발견할 수 없습니다. 정확히 말하면, 컴파일 단계에서 casting 관련해 전혀 신경을 쓰지 않습니다. 따라서, 어떠한 casting도 허용되며 프로그래머가 의도하지 않은 실수가 런타임에 예상치 못한 버그로 발현될 수 있습니다. 이러한 이유로 혹자는 C style casting은 무적이라고 말하기도 합니다.
- 직관적이지 않음
위 예제는 코드 사이즈가 크지 않아 명시적 형변환을 하고 있음을 알 수 있지만, 프로젝트 규모가 커질수록 직관적이지 않습니다. 수많은 괄호를 보게 될 것이고, 용법도 다 다르기 때문에 어떤 경우에 형변환을 의도했는지 알 수 없죠. 추가로 캐스팅에 의한 오류는 런타임 에러로 발현되기 때문에 디버깅을 통해 찾아내기도 쉽지 않습니다. 이런 문제점들을 개선하고자 C++ style explicit casting 사용을 권장하고 있습니다.
위의 두 이유가 C style casting의 사용을 권장하지 않는 대표적인 이유들입니다. 이를 방지하고자 C++은 다섯 개의 cast operator를 제공해 개발자의 의도를 세분화할 수 있게 했습니다. 이는 다른 사람이 코드를 볼 때 개발자의 의도를 파악할 때에도 큰 도움이 됩니다. 참고로 assembly level에서 C++, C casting은 같습니다.
Implicit Casting
묵시적 Casting은 별도의 선언 없이 컴파일러가 형변환을 해주는 것이며, 크게 확대 변환과 축소 변환이 있습니다. 이에 대한 자세한 내용은 아래 포스트에서 다루도록 하겠습니다.
(TBD)
Explicit Casting
명시적 casting은 프로그래머가 형 변환을 위해 코드를 직접 작성하는 것을 의미합니다. C style casting과 cast operator가 있으나, 전자는 앞서 다루었으니 더 이상 다루지는 않겠습니다. Cast operator들은 각자 예제와 함께 소개하는 게 좋다고 생각해 개별 포스트로 다루겠습니다.
(TBD)
Reference