• 4.5.1 typeinfo library header
  • 4.5.2 암시적 형 변환(Implicit Type Conversion(coersion))
  • 4.5.3 명시적 형 변환(Explicit Type Conversion(casting))

4.5.1 typeinfo library header

 

형 변환에 대해서 다루기 전에 유용한 라이브러리 하나를 소개하고자 한다.

#include <iostream>
#include <typeinfo>

int main()
{
	using namespace std;

	cout << typeid(0.0).name() << endl;
	cout << typeid(0).name() << endl;

	bool variable = true;
	cout << typeid(variable).name() << endl;

	return 0;
}

typeinfo 라이브러리에 있는 함수 중 하나인 typeid().name()는 변수나 리터럴이 어떤 타입인지 알려주는 함수이다. 형 변환하면서 제대로 형 변환이 되었는지 체크하기 위해 쓰면 유용한 함수이다.


4.5.2 암시적 형 변환(Implicit Type Conversion(coersion))

 

암시적 형 변환은 컴파일러가 알아서 강제로 형 변환을 해주며, 프로그래머가 아무것도 하지 않아도 자동으로 수행하는 것이다. 아래의 예제에서는 프로그램이 실행되지만 다음과 같은 에러 메시지가 뜬다.

#include <iostream>
#include <typeinfo>

int main()
{
	using namespace std;

	int a = 123.0;
    
	cout << typeid(a).name() << endl;

	return 0;
}
warning C4244: 'initializing': conversion from 'double' to 'int', possible loss of data

C4244 에러는 데이터 손실이 있다고 언급을 하지만 프로그램이 실행되도록 둔다. 개발자가 실수로 값을 잘못 넣는 경우에 발생하니 발견하면 해당 변수에 대해 파악을 하고 수정해두는 것이 좋겠다.

 

빌드는 되지만 신경 쓰이는 에러 메시지가 뜬다.

 

암시적 형변환 중 numeric promotion이라 불리는 형 변환이 있다. numeric promotion은 작은 메모리를 가지는 데이터가 큰 메모리에 담기는 경우를 의미한다. 아래의 예시는 float 자료형이 double로 numeric promotion되었다. 우리말로 숫자 승격이라고 쓸 수 있겠다.

#include <iostream>
#include <typeinfo>

int main()
{
	using namespace std;

	float	f = 1.0f;
	double	d = f;

	cout << typeid(f).name() << endl;
	cout << typeid(d).name() << endl;

	return 0;
}

 

또 다른 암시적 형 변환으로 numeric conversion이 존재한다. 숫자 변환이란 의미를 가지는 이 암시적 형 변환은 서로 다른 자료형 간에 변환이나 큰 메모리를 가지는 데이터가 작은 메모리에 담기는 경우를 말한다. 큰 메모리에 담긴 데이터일지라도 작은 메모리가 감당 가능한 범위의 값이라면 컴파일러가 충분히 처리해준다.

#include <iostream>
#include <typeinfo>
#include <iomanip>

int main()
{
	using namespace std;

	float	d = 3;
	short	s = 2;
	
	cout << typeid(d).name() << endl;
	cout << typeid(s).name() << endl;

	int		i = 30000; // short 범위를 넘어가면 문제지만 안넘어가면 괜찮다.
	char		c = i;

	cout << static_cast<int>(c) << endl; // 48

	double	dd = 0.123456789;
	float		ff = dd;

	cout << setprecision(12) << dd << endl;
	cout << setprecision(12) << ff << endl;

	return 0;
}

4.5.3 명시적 형 변환(Explicit Type Conversion(casting))

 

명시적 형 변환은 프로그래머가 변환하겠다는 강력한 의사표현을 하는 것이다. 아래와 같이 C 스타일과 C++ 스타일, 그리고 최근 자주 쓰는 스타일이 있다.

int main()
{
	using namespace std;

	int i = int(4.0);			// c++ style
	i = (int)4.0;			// c style
	i = static_cast<int>(4.0);	// 최신
	
	return 0;
}

'Programming Language > C++' 카테고리의 다른 글

Section 4.7. 열거형 타입 enum  (0) 2021.11.28
Section 4.6. string 문자열 사용  (0) 2021.11.27
Section 4.4. using namespace  (0) 2021.11.13
Section 4.3. 외부 연결  (0) 2021.11.11
Section 4.2. 전역 변수와 정적 변수  (0) 2021.11.10

+ Recent posts