27-2-나.프렌드 클래스
두 클래스가 아주 밀접한 관련이 있고 서로 숨겨진 멤버를 자유롭게 읽어야 하는 상황이라면 클래스를 통째로 프렌드로 지정할 수 있다. 클래스 선언문내에 프렌드로 지정하고 싶은 클래스의 이름을 밝히면 된다. 다음 예는 Any 클래스를 Some 클래스의 프렌드로 지정하는 것이다.
class Some
{
friend class Any;
....
};
Any가 Some의 프렌드로 지정되었으므로 Any의 모든
멤버 함수들은 Some의 모든 멤버를 마음대로 액세스할 수 있다. 두 클래스가 협조적으로 동작해야 한다거나 상호 종속적인 관계에
있을 때 프렌드로 지정하면 편리하다. 앞 예제의 OutToday 함수를 Date 클래스의 멤버 함수로 선언하되 Date를
Time의 프렌드 클래스로 지정해 보자.
예제: FriendClass
|
#include <Turboc.h>
class Time
{
friend class Date;
private:
int hour,min,sec;
public:
Time(int h,int m,int s) { hour=h;min=m;sec=s; }
};
class Date
{
private:
int year,month,day;
public:
Date(int y,int m,int d) { year=y;month=m;day=d; }
void OutToday(Time &t) {
printf("오늘은 %d년 %d월 %d일이며 지금 시간은 %d:%d:%d입니다.\n",
year,month,day,t.hour,t.min,t.sec);
}
};
void main()
{
Date D(2005,01,02);
Time T(12,34,56);
D.OutToday(T);
}
OutToday 함수는 Date 클래스의 멤버 함수로
선언되었지만 Date가 Time의 프렌드 클래스로 지정되어 있으므로 OutToday는 Time 객체의 모든 멤버를 읽을 수 있다.
실행 결과는 앞의 예제와 동일하다. 개념적으로 이해하기 쉬운 간단한 예제를 보였는데 실제로 프렌드 클래스 지정이 꼭 필요한 예는
다소 크고 복잡하다. MFC 라이브러리의 경우 다음과 같은 프렌드 클래스의 예가 많이 존재한다.
▶ CDocument가 CView의 프렌드
▶ CTime이 CTimeSpan의 프렌드
▶ CToolBar가 CToolTipCtrl의 프렌드
▶ CPropertySheet가 CPropertyPage의 프렌드
모두 아주 밀접한 관계에 있는 클래스들인데 MFC의 구조를
공부해 보면 이 클래스들이 왜 프렌드여야 하는지 알게 될 것이다. CView와 CDocument는 하나의 실체에 대해 각각
외부와 내부를 다루는 관련있는 클래스이다. CView는 자신이 화면에 출력할 데이터를 읽기 위해 CDocument의 멤버를
마음대로 읽을 수 있어야 하며 CToolTipCtrl 클래스는 툴팁을 보여줄 버튼이나 영역을 구하기 위해 CToolBar의 멤버를
액세스해야 한다.
<출처>
댓글 없음:
댓글 쓰기