C++/C++ 연산자, 입출력 오버로딩

C++ 입출력 오버로딩

재윤 2023. 12. 2. 19:26
반응형

A가 Coord형 오브젝트 일 때

  • cout << A;
    • 이런 걸 해보자

오버로딩을 할 것인데 비 멤버 형태로 오버로딩을 할 것이다.

왜 멤버 형태로 오버로딩 자체가 불가능할까?

 

💡 cout << A;

 

  • 오른쪽의 A는 Coord형 오브젝트가 맞는데 왼쪽의 Coord형 오브젝트가 아니다. 왼쪽 것이 자기자신 클래스가 아니면 멤버로 오버로딩하는 건 물건너감.

그럼 저 cout의 정체가 뭐냐?

  • 아주 오래 전 C++에서 새로운 입출력 방식을 설명할 때 이들이 ‘객체’라고 설명을 했는데 객체..? 바로 오브젝트이다. 즉, 미리 선언된 오브젝트
  • 그리고 cout은 ostream이라는 클래스형의 오브젝트이다.
  • output stream이라는 뜻임.
  • 입력 스트림. 이 스트림이 입출력과 관련있는 요소

 

한 가지 더 보면

cout << 1 << 2 << 3;
  • 연산자 오버로딩의 개념을 이해하고 <<도 하나의 연산자이며, cout이 ostream이라는 클래스형의 오브젝트라는 것을 알았으니 이제 저것이 연산자가 여러 개 들어간 식이라고 인식할 수 있다.

저 식은

(cout << 1) << 2 << 3;
  • 먼저 맨 왼쪽의 2개가 연산에 쓰임.
  • 그런데 우리가 알듯이 뒤의 2와 3도 연산에 쓰여서 출력이 이어서 되어야함.
  • 그럼? 1을 출력을 끝낸 후에도 cout이 왼쪽에 남아 있어야함. 즉
cout << 2 << 3;
  • 이런 꼴이 되며
( cout << 2) << 3 -> cout << 3;
  • 다시 이런 과정을 거쳐 최종적으로 3까지 cout과 함께 << 연산에 쓰이게됨.

따라서!!

<< 연산을 오버로딩 할 때 왼쪽에 있던 녀석이 cout을 그대로 리턴해야함.

cout << 1의 리턴값이 cout이 되는 것.

그리고 매개변수 하나를 그냥 그대로 리턴하기 때문에, 시간을 줄이기 위해 레퍼런스로 리턴할 수도 있게 됨.

Coord.h

ostream &operator<<(ostream &, const Coord&);
  • 첫 번째 매개변수가 ostream, 두 번째 매개변수가 Coord형 오브젝트.
  • 첫 번째 매개변수에도 대체로 cout
  • 이때 리턴값이 레퍼런스.!

정의부

ostream &operator<<(ostream &out, const Coord &A){
 cout << ..
return out;
}
  • 마지막에 out을 그대로 리턴하는 것을 주목해야한다.
  • 이렇게 되면 cout << A처럼 불렀을 때 처음 couy이 레퍼런스 out에 들어가고 이 값이 레퍼런스 형 반환값으로 다시 리턴되어, 결국 맨 처음에 연산에 쓰였던 cout이 마지막까지 남아 연산 결과는 cout이 된다.

[C++ 강좌] 038 - 연산자 오버로딩 (7) - 입출력 연산자 오버로딩(<<, >>)

 

[C++ 강좌] 038 - 연산자 오버로딩 (7) - 입출력 연산자 오버로딩(<<, >>)

자, 이제야... 연산자 마지막 글입니다...바로 대망의 입출력 연산자 오버로딩입니다...네... A가 Coord...

blog.naver.com

 

반응형