2012년 8월 9일 목요일

friend class #2

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의 멤버를 액세스해야 한다.

<출처>

댓글 없음: