반응형
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) - 입출력 연산자 오버로딩(<<, >>)
반응형