: 형 변환을 공부하는 과제이다. 어떤게 안전한 형변환인지에 대해서 공부를 하게 된다.
: 모두의 코드 형변환 관련 링크
링크 : https://modoocode.com/17
: 데이터 직렬화 관련 링크이다. 저장소에 저장을 하거나 다른 컴퓨터에 데이터를 보낼때, 포인터는 주소자체를 가지고 있기 때문에 문제가 발생한다. 주소가 아닌 데이터로 바꾸어서 저장을 한 뒤에 보내주고, 그것을 다시 푸는 단계로 이루어 진다.
링크 : https://hub1234.tistory.com/26
: 기본적으로 형 변환을 하는 문제이다. static cast에 대해서 공부를 하게 된다. 형변환은 그다지 어렵지 않은데 예외처리가 미니쉘급으로 하려고 하다보면 끝도 없다. 다 작성하고 cpp의 코드 라인수를 보니 300줄이 넘어갔다.
먼저 들어온 대상의 타입을 확인한 뒤에 해당되는 타입에 보관한 뒤, char / int / float / double로 각각 변환하는 문제이다.
static cast
<Type> 변환하고자 하는 자료형이다. 객체의 포인터나 참조형이 와야 한다. static_cast<Type>(expr)
- 일반적으로 쓰인다고 생각하면 된다. 기본 자료형 데이터간의 형변환에 사용된다.
- 암시적 형변환이 가능할 때 명시적 형변환을 static cast로 시켜줄 수 있다.
- 포인터 타입(expr)을 다른 으로 변환하는 것은 허용되지 않지만, 상속 관계에 있는 포인터끼리의 변환은 가능하다.(하지만 다운캐스팅시에는 안전하지 않기 때문에 dynamic cast를 사용하자!!)
- 에러체크 시기 : static cast는 컴파일시, dynamic cast는 런타임시 에러 체크를 한다. 만약 컴파일시 이상이 없다면 런타임에서 에러가 나버린다. 다운 캐스팅으로 런타임시에 에러가 발생할 수 있다.
: reinterpret cast에 대해서 공부를 한다. 이 형 변환은 변환된 대상의 비트단위로 읽게 해준다. 만약 단위가 낮은 대상으로 이동을 하게 된다면 특정 부분만 가져간다.(데이터가 잘린다는 소리이다.)
또한 재미있는 것을 공부하게 되는데
reinterpret cast
<Type> 변환하고자 하는 자료형이다. 객체의 포인터나 참조형이 와야 한다. reinterpret_cast<Type>(expr)
- 임의의 포인터 타입간의 형 변환에 사용된다.
: 포인터 >> 포인터, 포인터 >> 일반변수, 일반변수 >> 포인터- 정수형을 포인터로 바꿀 수도 있다.
- 일반적으로 허용되지 않는 위험한 형 변환을 할 때 사용한다(위험), 비트단위로 보기 때문에 무조건 적인 형 변환이 가능하다.
: dynamic cast를 공부하게 된다. dynamic cast는 서로 상속 관계에 있는 클래스간의 형변환에서 주로 사용이 된다.
dynamic cast
<Type> 변환하고자 하는 자료형이다. 객체의 포인터나 참조형이 와야 한다. dynamic_cast<Type>(expr)
- 상속 관계에 있는 클래스에서 쓰인다.
- 런타임시에 실제로 캐스팅 가능한지 검사를 한다.(static은 컴파일시에 하기 때문에 static보다 dynamic이 더 안전하다)
: const cast에 대한 문제는 나와있지 않지만 가끔 형변환으로 쓰이기 때문에 정리해본다.
const cast
<Type> 변환하고자 하는 자료형이다. 객체의 포인터나 참조형이 와야 한다. void function1(int *num); void function2(void) { const int *num = 123; function1(num); // 이렇게 하면 타입의 불일치가 발생하여 에러가 발생한다. function1(const_cast<int *>(num));//이렇게 해주면 잠깐 const를 풀어준다. }
- 함수의 인자를 전달할 때 const로 인하여 type불일치가 생겨 에러가 날 때 사용을 한다
- 포인터 또는 참조형의 const를 잠깐 풀어주는데 사용한다. 하지만 일반 변수, 함수 포인터, 멤버 함수에 대해서는 const를 풀어줄 수 없다.
- 원본은 변경하지 않기 때문에 안전하지만, 값을 포인터로 바꾼후 원본값을 새로운 포인터로 넘겨 받는다면 바뀐 값이 넘어간다.
**형 변환 관련 내용은 특정사이트를 참고 하였지만, 링크를 못찾아서 추후에 참고한 링크를 추가해놓도록 하겠습니다.
: static과 dynamic cast가 각각 컴파일/런타임시에 에러를 검사한다는 것을 알게 되었다. 작동을 언제하냐에 따라서 안전한지 안전하지 않은지가 나뉘게 되어 신기했다. 형 변환을 앞으로도 많이 사용하게 될 것 같은데 되록 안전한 대상으로 해야겠다고 생각했다.
: 위에 링크를 달아 놓긴 했는데, 이 부분이 상당히 신기했다. 과제에서는 둘다 공부를 하라고 해놓은 느낌이 들어서 좋기도 했다. 막상 과제를 할 것은 별로 없었지만 serialization에 대해서 공부하고 어떤 것인지 알게 되었다.
: 사실 파싱을 한다거나 예외처리를 하려고 하면 끝도 없이 하겠지만, 이것을 끝도 없이 한다고 해서 배우는게 어떤 건지 잘 모르겠다. 적당히 한다고 했는데 그게 300줄이나 나오다니... 평가를 해주시는 분들에게도 형 변환이라던지 다른 부분에 좀 더 정확한 설명을 하기 위해 노력했다.