본문 바로가기

문과 코린이의, [C. C++] 기록/C++ 이론

[문과 코린이의 IT 기록장] C,C++ - friend 선언( friend란?, 클래스와 friend 선언, friend 선언은 언제 해야하는가?, 함수의 friend 선언 )

반응형

 

[문과 코린이의 IT 기록장] C,C++ - friend 선언

( friend란?, 클래스와 friend 선언, friend 선언은 언제 해야하는가?, 함수의 friend 선언 )


 

 1. friend란?
: private 맴버의 접근을 허용하는 선언이다.

- friend는 접근 지정자를 완벽히 무시할 수 있는 기능을 가졌다. 즉, private건, protect건, friend라고 선언된 대상에게는 완벽하게 public으로 작용한다.
- friend는 당하는 쪽에 선언하며, 그 내용을 자기 클래스 안(혹은 함수)에 담는다.

[ friend 선언의 특징 ]
1) friend지정은 단 방향이며, 명시적으로 지정한 대상만 friend가 된다.
2) friend지정은 전이되지 않으며, friend의 friend관계는 인정하지 않는다.
3) 복수의 대상에 대해 동시에 friend를 지정할 수 있지만, 한 번에 하나씩만 가능하다.
4) friend 관계는 상속되지 않는다.


 2. 클래스와 friend 선언
: 특정 클래스의 입장에서, 다른 클래스를 자신의 친구(friend)로 선언하는 것. 대상에게 자신을 public처럼 인식될 수 있게 한다.

: friend선언은 클래스 내부에 어디든 위치할 수 있다.

Class Boy{
Private:
int height; 
friend class Girl;
 // Girl클래스를 friend로 선언함. 즉, Girl 클래스 내에서는, Boy클래스의 모든 private맴버에 직접 접근이 가능하다. 

Public:
Boy(int len):height(len){ }
 // 생성자
.......
};


Class Girl {
Private:
char phNum[20]; // 전화번호
Public:
Girl(char * num){ strcpy(phNum, num); }
void ShowYourFriendInfo(Boy & frn){ cout<<"His height : " << frn.height<<endl;}
 // Boy의 private 맴버인 height에 접근.



ex )

이 코드에서, Void Boy::ShowYourFriendIfno(Girl & frn)부분은 제대로 컴파일 시키기 위해서, Girl 클래스의 정의보다 뒤에 존재한다. (Girl의 정보를 가져야하기 때문에)

 



 3. friend선언은 언제 해야 하는가?
- friend 선언은 객체지향에서 매우 중요한, 정보은닉을 무너뜨리는 문법이다.
- 따라서 마구잡이로 사용하면 안되고, 필요한 상황에서 극히 소극적으로 사용해야 한다.
 cf ) 연산자 오버로딩에서는, 이 내용이 큰 역할을 할 수 있다.



 4. 함수의 friend 선언
- 전역함수를 대상으로도, 맴버함수를 대상으로도 friend 선언이 가능하다.

friend Point PointOP::PointAdd(const Point&, const Point&);
friend Point PointOP::PointSub(const Point&, const Point&);
// PointOP클래스의 맴버함수 PointAdd, PointSub에 대해 friend 선언을 하고 있다.

Point PointOP::PointAdd(const Point & pnt1, const Point & pnt2){
opcnt++;
return Point(pnt1.x + pnt2.x, pnt1.y + pnt2.y);
// 이 함수는 , Point클래스의 friend로 선언되었기 때문에 private 맴버에 접근이 가능하다.
}

friend void ShowPointPos(const Point&);
// 전역함수 ShowPointPos에 대해 friend 선언을 하고 있다.



* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형