이번 포스팅에서는 캐스팅이 무엇이고, 어떻게 이뤄지는 지 알아보고자 합니다.
중점적으로 설명할 부분은 C++의 캐스팅이 되겠지만, C++의 부모격인 C언어의 캐스팅에 대해 알아보고
C언어의 캐스팅이 갖는 문제점이 뭔지 배워보도록 하겠습니다.
1) 캐스팅이란?
https://en.wikipedia.org/wiki/Type_conversion
캐스팅은 데이터의 타입을 다른 타입으로 바꿔주는 것입니다.
이를 통해 프로그래머는 데이터를 상황에 맞게 유동적으로사용할 수 있게 됩니다.
2) C언어의 캐스팅
C언어의 캐스팅은 변환하고자 하는 데이터 앞에 (변환하는자료형) 을 수식함으로써 이루어집니다.
위와 같이 캐스팅이 이루어지는 것을 확인할 수 있습니다.
뿐만 아니라, 단순히 변수의 캐스팅이 아닌 참조 타입의 변환도 이루어질 수 있습니다.
3) C언어의 캐스팅의 종류
C언어의 캐스팅은 세분화하여 4가지의 경우로 쪼갤 수 있습니다.
- 안전한 변환 VS 불안전한 변환
- 묵시적인 변환 VS 명시적인 변환
3 - 1) 안전한 변환 VS 불안전한 변환
안전한 변환이라는 것은 캐스팅하기 전과 한 후의 자료형이 일치하는 경우를 의미합니다.
데이터가 일부 날아가지 않고 온전히 그 상태를 유지하는 경우를 일컫습니다.
그와는 반대로 불안전한 변환이라는 것은 캐스팅하기 전과 한 후의 자료형이 불일치하는 경우를 의미합니다.
자세히 얘기하자면, 캐스팅한 자료형의 메모리 크기가 캐스팅하기 전 자료형의 메모리 크기보다 작다면
데이터의 손실이 발생합니다. 그리고 이런 경우의 캐스팅을 불안전한 캐스팅이라고 합니다.
3 - 2) 묵시적인 변환 VS 명시적인 변환
묵시적인 변환은 캐스팅을 하는 경우에 (변환하는자료형)을 수식하지 않는 경우를 의미합니다.
보통 자료형이 사용하는 메모리의 크기가 더 큰 쪽으로 캐스팅하는 경우에 묵시적인 변환이 일어납니다.
명시적인 변환은 기존의 캐스팅과 같이 (변환하는자료형)을 수식하는 경우를 의미합니다.
C#과 같은 언어들은 자료형이 다른 경우에 캐스팅이 이뤄지면 반드시 명시적 형변환을 하도록 지시합니다.
묵시적 형변환은 변환이 어디서 이뤄지는 지 찾기 힘들고, 결국 에러 발생시에 디버깅을 지연시키는 원인이 됩니다.
C++같은 경우에도 explicit 키워드를 사용함으로써 묵시적 형변환을 막을 수 있습니다.
4) C언어 캐스팅의 치명적인 문제
C언어의 가장 큰 특징은 포인터를 통해 메모리에 직접적인 접근이 가능하다는 것입니다.
캐스팅은 자료형뿐만 아니라 포인터에서도 사용이 가능한데, 이 점이 C언어의 캐스팅의 가장 큰 문제점입니다.
위의 코드에서 우리가 바꾸고자 하는 것은 Tree 클래스의 age였지만,
기존에 존재하던 동적할당된 Dog 클래스의 포인터 d의 animalIndex가 바뀌게 되버린 문제가 발생했습니다.
이러한 일이 벌어진 원인을 알기 위해서는 메모리의 구조를 알아봐야 합니다.
2개의 클래스는 위와 같은 메모리를 갖게 됩니다.
포인터끼리의 캐스팅은 데이터를 변하게 하지 않고 참조하고 있는 주소를 변하게 합니다.
이때 d 포인터는 Tree 클래스의 age를 가리키게 되지만, 내부 데이터는 그대로인 상황에서
데이터의 순서 상 가장 위에 위치한 animalIndex에 값을 덮어쓰게 됩니다.
즉, 변하면 안되는 데이터를 변하게 만들어버리는 치명적인 문제가 발생합니다.
이것이 C 스타일 캐스팅의 문제점입니다. 마구잡이로 사용해도 컴퓨터는 그저 실행할 뿐, 우리에게 알려주지 못합니다.
안전장치의 부재와 사용목적의 부재, 이 두 가지 부분이 C 스타일 캐스팅의 치명적인 문제가 됩니다.
다음 포스팅에서는 이러한 C 스타일 캐스팅의 문제를 어느 정도 보완하는 C++ 스타일의 캐스팅을 알아보겠습니다.
'C++' 카테고리의 다른 글
C++의 캐스팅 - dynamic_cast (0) | 2024.04.14 |
---|---|
C++의 캐스팅 - static_cast (0) | 2024.04.08 |
virtual , override 키워드 (0) | 2024.03.18 |
람다 (0) | 2024.03.18 |
함수 객체 (0) | 2024.03.11 |