• 2.6.1 Char type
  • 2.6.2 limits 헤더를 이용한 char 한계치 확인
  • 2.6.3 입력이 문자열이고 받는 메모리가 문자인 경우 버퍼의 작동 방식
  • 2.6.4 강제 형 변환

2.6.1 Char type

 

Char type은 문자를 다루는 자료형이다. 문자의 경우 ASCII CODE로 대응시켜서 다루게 되며, 이 때문에 char 자료형에 숫자를 저장해서 출력하는 경우 숫자가 아닌 문자가 나오게 된다. 출력 시 문자가 나오지만 숫자로 다룰 수 있는 특징이 있다. 문자를 대입하는 경우 홑따옴표(' ')를 사용하게 된다.

#include <iostream>

int main()
{
	using namespace std;

	char c1(65);
	char c2 = 'A';
    
	cout << c1 << " " << c2 << " " << int(c1) << " " << int(c2) << endl;

	return 0;
}

위의 코드를 실행하게 되면 둘 다 문자로는 A가 출력되고 숫자로는 65가 출력되는 것을 확인할 수 있다.


2.6.2 limits 헤더를 이용한 char 한계치 확인

 

아래의 코드를 통해 char 자료형의 한계치를 확인할 수 있다.

#include <iostream>
#include <limits>

int main()
{
	using namespace std;

	cout << sizeof(char) << endl;
	cout << (int)numeric_limits<char>::max() << endl;
	cout << (int)numeric_limits<char>::lowest() << endl;

	return 0;
}

char 자료형은 1byte의 크기를 가지며 양수는 127, 음수로는 -128까지 표현이 가능하다. 이러한 특징 덕분에 네트워크 통신 분야에서는 이를 작은 크기의 정수로 다루어서 사용하기도 한다.


2.6.3 입력이 문자열이고 받는 메모리가 문자인 경우 버퍼의 작동 방식

 

앞에서도 언급하였듯이 문자로 할당된 메모리는 하나의 값만 받는다. 하지만 사용자가 입력을 문자가 아닌 문자열로 입력하는 실수를 저지르면 어떻게 작동이 될까?

#include <iostream>

int main()
{
	using namespace std;

	char c1(65);

	cin >> c1;
	cout << c1 << " " << static_cast<int>(c1) << endl;

	return 0;
}

c1의 초기화는 65로 A가 저장되어 있다. 여기에 cin을 통한 사용자 입력을 받기로 한다. 하지만 사용자가 실수로 qwe를 입력하였다. 결과는 아래와 같다.

 

q만 받는다.

 

qwe가 입력되었지만 q만 c1에 저장해서 출력하는 것으로 프로그램이 끝나게 된다. 그럼 we는 자동으로 버려지도록 동작할까? 이번에는 위의 코드에서 입력을 두 번 더 받을 수 있도록 작성해서 코드를 작성하고 똑같이 qwe를 입력한다.

#include <iostream>

int main()
{
	using namespace std;

	char c1(65);

	cin >> c1;
	cout << c1 << " " << static_cast<int>(c1) << endl;

	cin >> c1;
	cout << c1 << " " << static_cast<int>(c1) << endl;

	cin >> c1;
	cout << c1 << " " << static_cast<int>(c1) << endl;

	return 0;
}

실행 결과는 아래와 같다.

 

qwe를 하나씩 출력한다.

 

이처럼 stream을 사용하게 되었을 때 문자열을 길게 나열해서 넣으면 받는 메모리 길이에 따라 자동으로 받고 남는 부분을 버퍼에 남기도록 동작하게 된다.


2.6.4 강제 형 변환

 

형 변환으로 여러 가지가 존재한다. 프로그래밍하면서 자주 본건 c-style casting이었다. cpp-style casting을 직접 써보진 않았지만 지금 보면서 생각해보면 아래처럼 제대로 감싸서 형 변환시키는 것이 안전할 거란 생각이 든다. static_cast도 존재하는데 이는 나중에 추가적으로 설명할 예정이다.

#include <iostream>
#include <limits>

int main()
{
	using namespace std;

	// c-style casting(강제 변환)
	cout << (char)65 << endl;
	cout << (int)'A' << endl;

	//cpp-style casting(강제 변환)
	cout << char(65) << endl;
	cout << int('A') << endl;

	// 추후 설명(기본형에 대한 변환을 컴파일러에게 미리 알림)
	cout << static_cast<char>(65) << endl;
	cout << static_cast<int>('A') << endl;

	// 위의 3개는 같은 결과를 보인다.


	//static_cast를 사용한다고해서 기존에 있는 것이 변하는 것은 아님
	char ch(97);
	cout << ch << endl;
	cout << static_cast<int>(ch) << endl;
	cout << ch << endl;

	return 0;
}

+ Recent posts