콘솔,파일 출력 연산자 오버로딩 (+=프렌드)(+=템플릿 객체에 대해서)(** 요약필요)

2020. 10. 26. 05:10컴퓨터 수업/C++

(프렌드) 바운드, 언바운드 : blog.plorence.kr/528

(프렌드) introvert, extrovert : stackoverflow.com/questions/4660123/overloading-friend-operator-for-template-class


 

출력 연산자 오버로딩의 예시 (호출부)

cout << ob1 << endl;

 

outFile << ob1 << endl;

inFile << ob1 << endl;


출력 연산자 오버로딩의 예시(정의부) (istream, ifstream, ofstream도 모두 마찬가지이다.)

관전포인트

 

1. 객체를 reference로 반환했다.

- cout << x << y 와 같이 연속적인 스트림으로 출력할 경우를 대비해서 reference로 반환한다.

 

2. 파라미터1을 const std::ostream& _cout 으로 받지 않았다.

- 입력된 _cout은 계속 갱신되어야한다.

 

3. 연산자 오버로딩이 파라미터를 2개 받았다.

- 메소드 연산자 오버로딩이 아닌, 클라이언트 함수 연산자 오버로딩이라는 뜻이다.

파라미터1이 연산자를 기준으로 좌측,

파라미터2가 연산자를 기준으로 우측이라 생각하자.


출력 연산자 오버로딩에서, 해당 클라이언트 함수가 프라이빗 필드에 접근하기 위한 방법

=프렌드

관전포인트

 

1. 런타임에 오버로딩된 출력 연산자가 호출되면, 해당 클라이언트 함수가 해당 클래스의 프라이빗 필드에 접근 권한이 있는지 확인한다.

 

즉 위의 friend std::ostream~~은 런타임에 출력 연산자를 호출할때나 호출된다. (실제론 그렇지 않지만...)



템플릿 클라이언트 함수의 연산자 오버로딩.

(일단 introvert,바운드 / extrovert,언바운드 는 차치하고 생각하자.)

관전포인트

 

1. 어떻게 읽어야하는가?

-현재 AAA는 익명성을 지향하기에, 그 어떤 DataType을 input으로 받더라도 이쪽으로 호출된다. 그 DataType을 AAA라고 호칭한다.


만약 프라이빗 필드에 접근하지 않고, 게터를 이용한다면?

관전포인트

 

1. 일단 컴파일된다.

- main함수에서 VecType<int> vec으로 선언된 vec 객체가 아규먼트로 넘어가므로, 파라미터와 아규먼트의 만남에서

 

VecType<AAA>& _vec = (VecType<int>) vec 에서 묵시적 형변환

 

AAA = int가 발생한다.

 

따라서 _vec.get_z는 VecType<int>에 접근해서 게터 메서드를 호출한다.


friend 키워드를 사용해서 프라이빗 필드에 접근하고 싶다면?

1. extrovert, 언바운드 방식.

관전포인트

1. class의 template형식 : CCC

   클라이언트 함수의 template형식 : AAA

-  VecType<int>가 생성되었고, 위에서 설명하였듯이, VecType<AAA> _vec = (VecType<int>) vec에서 묵시적 형변환이 발생한다. 따라서 _vec.x는 VecType<int>의 class 상세설명서를 보게된다.

 

이때 새로운 template BBB가 등장한다, 이때 BBB는 정해지지 않았으므로 "익명" 또는 "임의"라는 의미를 갖게 되므로, 그 어떤 dataType으로 template class가 생성되었더라도, 해당 friend함수는 유효하다. 유효~~~

 

2. introvert, 바운드 방식(1)

그냥 클래스 내부에 인라인으로 넣어버린다.

이는 언바운드 방식과 다르게 딱 그 Type에만 적용된다.

근데 이게 실제로 무슨 차이가 있지...?

언바운드는 int에다가 double, char 이런거 다 선언해둔 느낌이리면

바운드는    int에다가는 int, double에다가는 double 선언해둔 느낌인데, 결론적으로 둘은 같은거 아닌가..?

위에 template 안 붇는다.

 

->선언과 정의부를 분리한다면?

 

선언부

정의부는 위와 같다.

 

관전포인트

 

1. 아래 빨간 네모 확인