접근 권한을 부여하는 friend 키워드
이 글은 예전에 작성한 글로, 다시 읽어보니 설명이 부족한 생각이 들어서, 이를 보완하는 새로운 글을 작성했습니다.
friend 키워드
friend 키워드는 클래스의 멤버가 아닌 함수나 다른 클래스에게, 해당 클래스의 모든 멤버에 접근할 수 있는 권한을 부여하기 위하여 쓰입니다.
이 키워드는 권한을 주는 클래스 내에서 사용되고, 이 권한은 상속이 되지 않습니다.
또한, 접근 권한을 제어하기 위한 접근 지정자( public, protected, private )의 영향을 받지 않고, 클래스 내에 어떤 위치에서 선언돼도 상관이 없습니다.
접근 지정자에 내용은 여기에 정리해 두었습니다.
클래스를 상속하는 경우, 파생 클래스는 private 멤버에 대한 접근 권한이 없습니다.
그러나, friend 키워드를 받은 함수 또는 외부 클래스는 private 멤버에도 접근할 수 있습니다.
friend 함수
friend 함수는 클래스의 멤버 함수로 간주되지 않지만, 클래스의 모든 멤버에 접근할 권한을 가진 함수입니다.
전역 함수의 경우, friend 키워드를 사용하면 함수를 선언한 것처럼 처리되기 때문에, 전역 함수를 구현하기 전에 클래스 내에서 friend 선언을 할 수 있습니다.
class A{
int m_nPrivate; // private 멤버
friend int GetPrivate( const A& obj); // friend 함수 선언
};
int GetPrivate( const A& obj){ // friend 함수
return obj.m_nPrivate;
}
int main(){
A obj;
cout << GetPrivate(obj) << endl;
return 0;
}
그러나 클래스의 멤버 함수 같은 경우, 컴파일러가 멤버 함수의 존재를 모르기 때문에 멤버 함수가 선언된 후에 friend 선언을 할 수 있습니다.
class SupportA; // 클래스 존재만으로는 부족합니다
class A{
int m_nPrivate;
// error !! 함수의 정체를 모릅니다.
friend int SupportA::GetPrivate( const A& obj);
};
class SupportA{
int GetPrivate( const A& obj){
return obj.m_nPrivate;
}
};
제대로 작동하게 하려면, 클래스 A의 선언부가 SupportA 선언보다 나중에 와야 합니다.
class A; // 클래스임을 알려줌
class SupportA{
public: // 클래스 A에서 함수에 접근할 수 있어야 합니다.
int GetPrivate( const A& obj);
};
class A{
int m_nPrivate;
friend int SupportA::GetPrivate( const A& obj); // friend 함수로 선언
};
// class A의 멤버를 알아야 하기 때문에, 외부에 구현
int SupportA::GetPrivate( const A& obj){
return obj.m_nPrivate;
}
int main(){
A obj;
SupportA sObj;
cout << sObj.GetPrivate(obj) << endl;
return 0;
}
friend 클래스
friend 클래스는 그 클래스의 모든 멤버 함수가, friend로 지정한 클래스의 모든 멤버에 접근할 수 있는 권한을 받은 클래스입니다.
#include <iostream>
using namespace std;
class A{
int m_nPrivate;
friend class SupportA; // friend 클래스로 선언
};
class SupportA{
public:
int GetPrivate( const A& obj){ // A 클래스의 모든 멤버에 접근 가능
return obj.m_nPrivate;
}
void SetPrivate( A& obj, int val){ // A 클래스의 모든 멤버에 접근 가능
obj.m_nPrivate = val;
}
};
int main(){
A obj;
SupportA sObj;
sObj.SetPrivate(obj, 10);
cout << sObj.GetPrivate(obj) << endl;
return 0;
}
위의 예에서 클래스가 friend로 지정되었기 때문에, GetPrivate와 SetPrivate 함수 모두 friend 함수와 같은 권한을 가지게 되었습니다.
'C, C++ > C++ 언어' 카테고리의 다른 글
[C++] 우측값 참조( rvalue reference )와 이동 생성자( move constructor ) (0) | 2024.06.25 |
---|---|
[C++] 좌측값( l-value )과 우측값( r-value ) 구분하기 (0) | 2024.06.23 |
[C++] 접근 지정자 public, protected, private 사용법 (0) | 2024.05.29 |
[C++] 추상 클래스와 순수 가상 소멸자 (0) | 2024.05.25 |
[C++] 동적 바인딩과 가상 함수 테이블 ( V-Table ) (0) | 2024.05.24 |