[C++] namespace, using, 입출력 구현 (cin, cout)

2024. 3. 19. 13:30Programming Language/C++

`main.cpp`

#include <iostream>

// *네임 스페이스
namespace MYSPACE
{
	int g_int;  // 전역 변수
}

namespace OTHERSPACE
{
	int g_int;
}

// *using
// 개별적, 세부적으로 해제
using std::cout;
using std::wcout;
using std::cin;
using std::endl;

// *endl
// endl도 함수이다.
// 이 함수가 호출되면 커서가 아래로 하나 내려갈 뿐이다.
// 이 함수는 operator >>와 operator << 함수가 받아간다.
void MyEndL()
{
	wprintf(L"\n");
}

// cin, cout을 하나의 클래스에 구현했다.
class CMyOStream
{
public:
	//----------- cout 구현 -----------//
	// 연산자 오버로딩
	// 1byte 문자열
	CMyOStream& operator << (int _idata)
	{
		printf("%d", _idata);
		return *this;
	}

	// 2byte 문자열
	CMyOStream& operator << (const wchar_t* _pString)  // 문자열의 시작 주소를 받아간다.
	{
		wprintf(L"%s", _pString);  // %s : 문자열 출력
		return *this;
	}

	//----------- cin 구현 -----------//
	// 정수 버전
	CMyOStream& operator >> (int& _idata)
	// _idata는 해당 멤버 함수 내의 지역 변수이다.
	// int a = 0;
	// mycout >> a;  // a에 입력이 되어야 한다. (ex. 100을 입력하면 a에 입력된다.)
 	// C의 scanf는 원본의 주소를 받아가지만 C++에서는 래퍼런스가 있다.
	// 주소를 넘기지 않아도 참조를 넘기면 되고, 수정할 것이기 때문에 const는 붙이지 않는다.
	{
		scanf_s("%d", &_idata);
		return *this;
	}

	//----------- endl 구현 -----------//
	CMyOStream& operator << (void(*_pFunc)(void))
	{
		_pFunc();
		return *this;
	}
};

// 자료형으로 만든 것은 실체가 없을 수가 없다.
// 때문에 클래스 안에 멤버가 아무것도 없어도 그 크기는 1byte이다.
CMyOStream mycout;  // mycout : 멤버 함수에 호출된 객체의 주소로, CMyOStream의 this에 해당한다.

int main()
{	
	//g_int = 0;  // 오류 // MYSPACE 안에 선언되어있기 때문이다.
	MYSPACE::g_int = 0;  // 네임스페이스에 접근하려면 범위 지정자(::)를 사용해야 한다.
	// 동일한 변수명(g_int)이지만 다른 공간에 있기 때문에 가능하다.
	OTHERSPACE::g_int = 0;

	// mycout에 그냥 한글을 넣으면 ??로 나오면서 깨진다.
	// VS 지역 언어 설정을 표준으로 쓰다보니까 한글 설정이 기본으로 안 되어있을 수 있다.
	// 아스키 코드 대응표를 한글 쪽으로 맞춰준다.
	setlocale(LC_ALL, "korean");
	_wsetlocale(LC_ALL, L"korean");

	//mycout << 10 << 20 << 30;
	mycout << L"한글";
	
	mycout << 10 << L" " << 20 << L" " << L"문자열" << MyEndL;

	return 0;
}