[C++] printf(), scanf()로 cin, cout 구현

2024. 4. 2. 14:26Programming Language/C++

#include <iostream>
#include <cstdio>  // printf(), scanf_s()
#include <clocale> // setlocale(), _wsetlocale()

// 사용자 정의 입출력 스트림 클래스
	// cin, cout을 하나의 클래스에 구현했다.
class CMyIOStream {
public:
    //--------- cout 구현 ---------//
    // 연산자 오버로딩: 정수 출력
    CMyIOStream& operator<<(int _idata) {
        printf("%d", _idata);  // 정수 출력
        return *this;  // 객체 자기 자신 반환
    }

    // 연산자 오버로딩: 문자열 출력 (1byte 문자열)
    CMyIOStream& operator<<(const char* _pString) {
        printf("%s", _pString);  // 문자열 출력
        return *this;  // 객체 자기 자신 반환
    }

    // 연산자 오버로딩: 문자열 출력 (2byte 유니코드 문자열)
    CMyIOStream& operator<<(const wchar_t* _pString) {
        wprintf(L"%s", _pString);  // 유니코드 문자열 출력
        return *this;  // 객체 자기 자신 반환
    }

    //--------- cin 구현 ---------//
    // 연산자 오버로딩: 정수 입력
    CMyIOStream& operator>>(int& _idata) {
        scanf_s("%d", &_idata);  // 정수 입력
        return *this;  // 객체 자기 자신 반환
    }

    // 연산자 오버로딩: 문자열 입력 (1byte 문자열)
    CMyIOStream& operator>>(char* _pString) {
        scanf_s("%s", _pString, 100);  // 최대 100자 입력
        return *this;  // 객체 자기 자신 반환
    }

    // 연산자 오버로딩: 문자열 입력 (2byte 유니코드 문자열)
    CMyIOStream& operator>>(wchar_t* _pString) {
        wscanf_s(L"%s", _pString);  // 유니코드 문자열 입력
        return *this;  // 객체 자기 자신 반환
    }

    //--------- endl 구현 ---------//
    // 함수 포인터를 활용하여 endl 동작 구현
    CMyIOStream& operator<<(void(*_pFunc)(void)) {
        _pFunc();  // 전달받은 함수 호출
        return *this;  // 객체 자기 자신 반환
    }
    // endl은 출력과 관련된 함수이므로 operator>>() 즉, cin은 구현할 필요가 없다.
};

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

// 사용자 정의 스트림 객체 생성
CMyIOStream mycout;  // mycout : 멤버 함수에 호출된 객체의 주소로, CMyOStream의 this에 해당한다.

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

    // cout 테스트
    mycout << L"한글" << 123 << L" " << L"cout 테스트" << MyEndL;

    // cin 테스트
    int input = 0;
    char str[100];
    wchar_t wstr[100];

    mycout << L"숫자 입력: ";
    mycout >> input;
    mycout << L"입력한 숫자: " << input << MyEndL;

    mycout << L"문자열(1바이트) 입력: ";
    mycout >> str;
    mycout << L"입력한 문자열: " << str << MyEndL;

    mycout << L"문자열(2바이트) 입력: ";
    mycout >> wstr;
    mycout << L"입력한 유니코드 문자열: " << wstr << MyEndL;

    return 0;
}

▽ 출력 결과

한글123 cout 테스트
숫자 입력:

▽ 콘솔 창에 아무 숫자와 문자열 입력한 후

한글123 cout 테스트
숫자 입력: 456
입력한 숫자: 456
문자열(1바이트) 입력: 달
입력한 문자열: 달
문자열(2바이트) 입력: 바다
입력한 유니코드 문자열: 바다