CPP_어소_58_입출력 구현

CJB_ny·2022년 7월 2일
0

CPP_AROTHO

목록 보기
57/83
post-thumbnail

이거 C#에서도 동일함

객체 없이도 호출가능한거

'::' 범위 확인하는 연산자.

namespace

g_int는 지금 전역변수이다.

왜? => 어떤 함수안에 선언을 하지 않았기 때문에

접근 하려면 이렇게 해야함.

왜 쓰는데?

cin, cout은 C, C++ 표준기능들이 namespace std안에

들어있는 것이다.

#include < iostream >을 통해서 cin, cout기능을 사용할 수 있는데 이것이,

그런데 이 기능들이 전부다 namespace std안에 다 구현이 되어있는 것이다.

그래서 지칭 해주어야함.

namespace 로 변수명 구분해줄려고.

namespace선언 귀찮다.

using std

그래서 std::cin => cin으로 사용가능.

그런데 기능상실할 수 있다 == 모호해진다.

이런경우.

그래서 특정 기능들만 가지고 오고 싶을 경우

using std::cin
using std::cout

이런식으로.


cout, cin 정체

ostream이라는 "객체"의 하나의 변수명이다.

cin은 isteam이라는 객체의 변수명이다.

이렇게 전역변수로 전언을 해놓음

근데

extern이다. == 외부변수


정젹변수, 외부변수 => 데이터영역
https://velog.io/@starkshn/CPP%EC%96%B4%EC%86%8C%EC%A7%80%EC%97%AD%EC%A0%84%EC%97%AD-%EB%B3%80%EC%88%98


extern 사용왜 했드라? ❗❗

extern a해서 a를 데이터 영역에 올려서

프로그램 실행 내내 상주 시켜서 안 없어지게 할려고.

전역변수는 특정 cpp에서밖에 안되니까 extern을 사용하는 것임.

여러개의 파일에서 공통으로 접근할 수 있는 전역변수 만들 때,
extern 썻었다.

#include < iostream >

  • cout은 ostream이라는 클래스로 만든 "전역변수"이다.

    근데 extern 키워드로 모든 파일에서 접근 가능.

을 하게되면 프로그램 실행을 하면서

하나밖에 없는 전역 객체 cout, cin를 알게되는 것이다.

<<, >> ??

애내들은 뭔데 그럼?

"연산자 오버로딩"이다.

중간 참고

이런 경우 객체를 만들었다면 실체는 그래도 있어야하니까

자료형의 타입을 1바이트로 준다.

연산자 오버로딩

이렇게 오버로딩 해준다.

'<<' 호출??

이렇게하면 호출됨.

cout 전역변수의 연산자 오버로딩 반환 ❗❗❗❗

호출해준애가 mycout이라 operator에 들어온 객체는

this == mycout이다.

그래서

이부분에서 cout << "asd" << 10 << endl;

이 가능한 이유가

연산자 오버로딩을 통한 cout << "asd"를 하면

인자로 받아간 asd를 처리를 하고 반환 값으로 자기 자신을 반환함

그래서

cout << "asd"를 하고나서 반환으로 cout이 다시 와서

cout << 10 << endl;이 연속적으로 일어나는게 가능하다.

그러면 연산자 오버로딩이 ❗❗❗❗

자기 자신의 주소(자기자신을 참조)를 반환해야함

return *this는

자기자신(원본)을 반환하는데

operator의 반환값이 CMyOStrea&이라 참조를 this의 원본에 접근(*)해 자기 자신의 참조를 반환한다.


지금 반환타입이 CMyOStream& 이 잘 이해가 가지 않는다 =>
https://velog.io/@starkshn/CPP%EC%96%B4%EC%86%8C54%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B0%B0%EC%97%B4
이거 밑에 부분 다시 읽으셈


2바이트 문자열 출력

"안녕" == '안' => 1바이트, '녕' => 1바이트인데

2바이트 문자열 출력하려면

using std::wcout

CMyOStream& operator(const wchar_t* InputString)
{
	printf("%s\n", InputString);
    return *this;
}

출력할때는

mycout << L"안녕하세요" << endl;

이렇게 오버로딩해주고

이거 추가해준다.

cin 구현 (인자로 참조 받기) ❗❗❗❗❗

C 스타일에서는

입력을 받을 때, scanf를 통해서 주소를 넘겨주었었는데

c++에서는 refrence사용이 가능하니까

mycout 객체에 << a 변수를 넘겨주고

이렇게 << 오버로딩 연산자에서 int&

참조를 받으면됨.

안에서는 scanf_s("%d", &_data);

endl == "함수"이다.❗❗❗

이런 함수임. 반환은 void인데

이것을 호출 하려면,

반환 타입이 void이고 인자도 void인 함수를 호출 하겠다 이다.

<< 연산자를 오버로딩 했을 경우.


void(*Func)(void) 이해가 안간다면
https://velog.io/@starkshn/CPP%EC%96%B4%EC%86%8C48%ED%95%A8%EC%88%98-%ED%8F%AC%EC%9D%B8%ED%84%B0


void-1 (Func)-2 void-3
반환타입이 void-1이고, 인자가 없는(void-3) 그런 함수의 주소를(Func-3)를 받겠다.

정리

그러니까 << 연산자를 오버로딩했는데,

무슨 버젼으로 오버로딩했냐면은

인자로 반환타입이 void이고 인자로 아무것도 받지 않는(void) 함수의 주소를 받는다는 뜻이다.

사용은

가 이렇게 선언되어있기 때문에

이렇게 호출해 줄 수 있는 것이다.

(지금은 MyEndl인데 이게 endl이라는 이름으로 되어있을 뿐이다.)

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글