값 타입 변환
의미를 유지하기 위해서, 원본 객체와 다른 비트열을 재구성
ex) int를 float형으로 변환시 비트의 구성이 다르기때문에 비슷한 값으로 비트열이 재구성 됨
참조 타입 변환
비트열을 재구성하지 않고, 관점만 바꾸는 것
ex) int를 float형의 레퍼런스로 변환시 비트는 그대로지만 비트의 구성이 다르기때문에 출력 값이 다르다.
실제로 사용하는 일은 거의 없을 것이다.
안전도 분류
안전한 변환: 의미가 항상 100% 일치하는 경우
ex) int를 long long으로 변환
불안전한 변환: 의미가 항상 100% 일치한다고 보장하지 못하는 경우
타입이 다르거나 더 작은 크기로 변환할 때
ex) int를 float로 변환
프로그래머의 의도에 따른 분류
암시적(implicit) 변환: 컴파일러가 자동으로 타입 변환
명시적(explicit) 변환: 사용자가 명시적으로 타입 지정
아무런 연관 관계가 없는 클래스 사이의 변환
일반적으로는 안되지만 타입 변환 생성자/연산자로 가능하게 만들어 줄 수 있다.
참고) 타입 변환 연산자는 반환값이 없다.
operator Knight()
{
return (Knight)(*this);
}
연관 없는 클래스 사이의 참조 타입 변환
명시적으로 변환하는것은 가능하다. (=문법상으로는 문제 없다.)
상속 관계에 있는 클래스 사이의 변환
1) 상속 관계 클래스의 값 타입 변환 : 자식->부모(O) 부모->자식(X)
2) 상속 관계 클래스의 참조 타입 변환: 자식->부모(O) 부모->자식(암시적X, 명시적O)
크기가 큰 객체를 함수의 인자로 넘겨줄 때 값에 의한 복사로 넘겨주면 오버헤드가 심하게 발생하기 때문에 포인터로 넘겨주어야 한다.
명시적으로 타입을 변환할 때는 항상 조심해야만 한다.
객체를 동적 할당할 때 업캐스팅, 사용할 때 다운캐스팅을 하는 경우가 많기 때문에 타입 변환에 의한 실수가 일어날 가능성이 높다.
업캐스팅으로 동적 할당한 객체는 별다른 처리 없이 메모리 해제시에는 업캐스팅 대상 클래스의 소멸자까지만 호출이 된다.
따라서 상속 관계가 있는 클래스의 경우 부모 클래스(또는 최상위 클래스)의 소멸자를 가상 소멸자로 지정해주면 소멸자가 의도한 대로 잘 작동하게 된다.
가상 소멸자에 대한 내용은 면접에 거의 항상 나오는 단골 질문이다.
'C++ > Rookiss C++' 카테고리의 다른 글
[동적 할당] 캐스팅 4총사 (0) | 2022.08.29 |
---|---|
[동적 할당] 얕은 복사 vs 깊은 복사 (0) | 2022.08.29 |
[동적 할당] 동적 할당 (0) | 2022.08.28 |
[객체지향 여행] (0) | 2022.08.28 |
[포인터] #2/2 (0) | 2022.08.27 |