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

<출처>

댓글 없음: