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
'[ Programing ] > C++' 카테고리의 다른 글
printf Type Field Characters (0) | 2010.01.31 |
---|---|
[기초] class에 있는 메소드를 일회용성으로 불러 오기. (0) | 2010.01.31 |
Char* 버퍼에 여러 종류의 데이터 처리 (0) | 2010.01.31 |
const, const int, int* const, const int* const n 설명 (0) | 2010.01.31 |
parameter++; 과 ++parameter; 의 차이. (0) | 2010.01.31 |