블로그는 나의 힘!
[ Programing ]/C++2010. 1. 31. 07:18
 friend에 대해 정리해 보자. 
- class에서 캡슐화, 은닉화를 시켜 외부 접근을 허용하지 않게 하고, 객체화 하는 것이 class의 기본적인 바탕이다.
- 그런  calss에서  friend 선언은 해당 객체나 함수가 접근을 허용하게 해 나의 모든 곳을 이용할 수 있다. 말 그대로 friend.
- 하지만 그 class의 friend선언은 해당 friend가 선언된 class는 접근이 가능 하지만, 
   반대로 friend로 선언된 객체로 접근 할려면 무효. 
   반대편에서도 friend로 선언해야지만 접근 가능한 단방향이라는 점이 특징.
- friend는 기본적인 oop 개념을 무너뜨리는 방식이라 많이 사용하지 않는 방식이라, 보통 크게 거론을 하지 않는다.


// <<<<<<<<<<<<<<<<<<<< ClassTest1.h START >>>>>>>>>>>>>>>>>>>>>>>>
#ifndef  __OBJECT_CLASSTEST1_Q_H__
#define __OBJECT_CLASSTEST1_Q_H__

class ClassTest1
{
int m_nNumber1;

        // friend 선언. 해당 ClassTest2는 ClassTest1를 이용 할 수 있다.
        // private도 이용 가능.
        friend class ClassTest2;     

void Print1();
public:
ClassTest1();
~ClassTest1();
};

#endif
// <<<<<<<<<<<<<<<<<<<< ClassTest1.h END >>>>>>>>>>>>>>>>>>>>>>>>
// <<<<<<<<<<<<<<<<<<<< ClassTest2.h START >>>>>>>>>>>>>>>>>>>>>>>>
#ifndef  __OBJECT_CLASSTEST2_Q_H__
#define __OBJECT_CLASSTEST2_Q_H__

class ClassTest2
{
int m_nNumber2;

public:
ClassTest2();
~ClassTest2();

void Print2( ClassTest1& Test1 );
};

#endif

// <<<<<<<<<<<<<<<<<<<< ClassTest2.h END >>>>>>>>>>>>>>>>>>>>>>>>
// <<<<<<<<<<<<<<<<<<<< ClassTest1.cpp START >>>>>>>>>>>>>>>>>>>>>>>>
#include <stdio.h>
#include "ClassTest1.h"

ClassTest1::ClassTest1() 
{
m_nNumber1 = 0;
}

ClassTest1::~ClassTest1() 
{
}

void ClassTest1::Print1()
{
printf( "ClassTest1 \n" );
}
// <<<<<<<<<<<<<<<<<<<< ClassTest1.cpp END >>>>>>>>>>>>>>>>>>>>>>>>
// <<<<<<<<<<<<<<<<<<<< ClassTest1.cpp START >>>>>>>>>>>>>>>>>>>>>>>>
#include "Main.h"
#include "ClassTest1.h"
#include "ClassTest2.h"

ClassTest2::ClassTest2() 
{
m_nNumber2 = 0;
}

ClassTest2::~ClassTest2() 
{
}

void ClassTest2::Print2( ClassTest1& Test1 )
{
Test1.m_nNumber1 = 5;
       // ClassTest1의 private로 선언된 Print() 메소드로 접근
        // 보통 같으면 오류를 일으키나, friend 선언으로 오류 없이 잘 실행된다.
Test1.Print1();       
printf( "ClassTest2 \n" );
}
// <<<<<<<<<<<<<<<<<<<< ClassTest1.cpp END >>>>>>>>>>>>>>>>>>>>>>>>
// <<<<<<<<<<<<<<<<<<<< Main.cpp START >>>>>>>>>>>>>>>>>>>>>>>>
#include <stdio.h>
#include "ClassTest1.h"
#include "ClassTest2.h"

void main()
{
ClassTest1 cTest1;
ClassTest2 cTest2;

cTest2.Print2( cTest1 );
}
// <<<<<<<<<<<<<<<<<<<< Main.cpp END >>>>>>>>>>>>>>>>>>>>>>>>

결과 :
ClassTest1
ClassTest2




Posted by Mister_Q