본문 바로가기
Programming/C, C++

C++ 클래스 private접근, Friend 지정 사용

by Dev_카페인 2022. 11. 17.
반응형

[C++] 클래스 private접근, Friend 지정 사용

 

클래스의 멤버 중 private로 지정된 것들은 자신만 접근할 수 있게 설계되었는데 예외는 있다.

Friend 키워드이다.

 

내 소중한 물건을 친구에게 빌려줄 수 있듯이 클래스에서 친구로 지정한 것들은 접근이 가능하다.

전역 함수, 클래스, 멤버 함수를 Friend로 지정 가능하다.

그 세 가지 예시를 하나의 코드에 담았다.

 

 

#include <iostream>
using namespace std;

// * 클래스의 순서도 중요
// 하단 예시 코드는 클래스의 순서를 고려하지 않은 코드임
class PrivateClass;

class UnknownClass
{
public:
	void FriendMemberFunction(PrivateClass& pc);	
};

class PrivateClass
{
	// 전역 함수 Friend로 지정 가능
	friend void GlobalFunction(PrivateClass& pc);
	// 모르는 클래스 안에 있는 멤버 함수를 Friend로 지정 가능
	friend void UnknownClass::FriendMemberFunction(PrivateClass& pc);
	// 하나의 클래스를 Friend로 지정 가능
	friend class FriendClass;
private :
	// Private로 지정된 것들은 자신과 Friend로 지정된 것들만 접근 가능하다.
	int privateValue = 10;
};

class FriendClass
{
public :
	void GetPrivateClassValue(PrivateClass &pc);
};


int main()
{
	// 객체 생성
	PrivateClass _PrivateClass;
	FriendClass _FriendClass;
	UnknownClass _UnknownClass;

	// 호출
	GlobalFunction(_PrivateClass);
	_FriendClass.GetPrivateClassValue(_PrivateClass);
	_UnknownClass.FriendMemberFunction(_PrivateClass);

	return 0;
}

// 전역 함수
void GlobalFunction(PrivateClass& pc) {
	cout << "Friend로 지정된 전역 함수는 PrivateClass의 비밀스런 값에 접근할 수 있다." << pc.privateValue << endl;
}

// Friend로 지정된 '클래스'의 멤버 함수
void FriendClass::GetPrivateClassValue(PrivateClass& pc)
{
	cout << "Friend로 지정된 클래스는 PrivateClass의 비밀스런 값에 접근할 수 있다." << pc.privateValue << endl;
}

// 클래스가 Friend로 지정되지 않았지만 UnknownClass클래스의 멤버 함수는 Friend로 지정됨
void UnknownClass::FriendMemberFunction(PrivateClass& pc)
{
	cout << "Friend로 지정된 멤버 함수는 PrivateClass의 비밀스런 값에 접근할 수 있다." << pc.privateValue << endl;
}
반응형