오늘의 주제는 friend 선언에 대한 이야기 입니다. friend 선언은 함수선언과 클래스 선언이 있는데 간단히 그 사용방법을 알아보도록 하죠.
friend 함수은 일반 함수인데 클래스 안에서 friend라는 키워드를 붙여서 선언해 주면 이 함수는 클래스 소속이 되어 클래스의 private와 같은 클래스 안에서만 접근 권한이 있는 것들을 접근 할 수 있습니다. 이게 핵심이지요. 함수가 클래스 소속이 되어 클래스안을 접근 할 수 있는 권한이 생기는 것이 friend 함수라고 생각 하시면 됩니다.
class AAA{
private :
int a =10;
public:
friend int main(int argc, char** argv);
}
int main(int argc, char** argv) {
class AAA op1;
op1.output();
op1.a=20;
op1.output();
return 0;
}
위 코딩을 보시면 AAA 클래스 안에 main()함수를 friend로 선언을 하게 되면 이 main()함수는 AAA 클래스 안을 접근 할 수 있는 권한이 생깁니다. 그래서 main()함수 안에 이 코딩을 허용합니다.
op1.a=20;
a 멤버변수는 사실 private 로 클래스 안에서만 접근이 허용 되지만 main()함수가 클래스 접근 권한을 가지게 됨으로서 a 변수를 main()함수 안에서 사용 할 수 있게 된 것이죠.
op1.output();
그러면 a값인 20으로 수정된 값이 출력 되겠죠. 실습은 아래 종합해서 한개의 코딩으로 실습하도록 하죠. 우선 설명만 이해하시면 됩니다.
이 경우는 클래스 간의 서로 접근 권한을 갖는 것입니다. AAA 클래스와 BBB 클래스에 각각 서로 friend로 선언해 주면 서로 접근 권한을 가질 수 있게 됩니다.
class BBB;
class AAA{
friend class BBB;
private :
int a =10;
}
class BBB{
friend class AAA;
private:
int b=20;
}
위 예제를 보면 BBB 클래스 안에서 AAA 클래스의 멤버 변수 a를 접근 할 수 있습니다. 이렇게 서로friend 를 맺으면 접근 권한이 생기는 것이죠.
예제)
class AAA{
friend class BBB;
private:
int a=10;
public:
AAA(){ cout<<"생성자AAA"<<endl;}
~AAA(){ cout<<"소멸자AAA"<<endl;}
void output();
friend int main(int argc, char** argv);
};
class BBB{
friend class AAA;
private:
int b=30;
public:
BBB(){ cout<<"생성자BBB"<<endl;}
~BBB(){ cout<<"소멸자BBB"<<endl;}
void f_output(AAA& oop1,int k){
cout<<"friend class AAA : "<<oop1.a+b<<endl;
}
};
int main(int argc, char** argv) {
class BBB op2;
op2.f_output(op1,5);
}
위 예제 코딩을 보시면 BBB 클래스에서 AAA 클래스 변수를 friend로 선언하면 oop1 객체 변수로 선언된 AAA 클래스를 접근 권한이 생겨 private 형인 a멤버변수를 접근 할 수 있게 됩니다. 그 접근 한 결과를 간단한 예제로 출력한 예제입니다.
코딩만 봐서는 사실 friend 선언이 잘 이해가 안 갈 수 있어 두 friend 함수와 클래스를 합쳐진 소스로 실습을 해보도록 하죠.
[전체소스]
#include
using namespace std;
/*
class AAA{
public:
char *arr_p;
public:
AAA(){ arr_p = new char [10];}
AAA(int size){ arr_p = new char [size];}
~AAA(){ delete[] arr_p; arr_p=NULL;}
void output(){
cout<<arr_p<<endl;
}
};
*/
class BBB;
class AAA{
friend class BBB;
private:
int a=10;
public:
AAA(){ cout<<"생성자AAA"<<endl;}
~AAA(){ cout<<"소멸자AAA"<<endl;}
void output();
friend int main(int argc, char** argv);
friend void f_output(AAA& oop1,int k);
};
class BBB{
friend class AAA;
private:
int b=30;
public:
BBB(){ cout<<"생성자BBB"<<endl;}
~BBB(){ cout<<"소멸자BBB"<<endl;}
void f_output(AAA& oop1,int k){
cout<<"friend class AAA : "<<oop1.a+b<<endl;
}
};
void AAA::output(){
cout<<"AAA : "<<a<<endl;
}
void f_output(AAA& oop1,int k){
cout<<"friend function AAA : "<<oop1.a+k<<endl;
}
int main(int argc, char** argv) {
class AAA op1;
class BBB op2;
op1.output();
op1.a=20;
op1.output();
f_output(op1,3);
op2.f_output(op1,5);
return 0;
}
코딩을 한줄 한줄 잘 보시기 바랍니다. 최대한 쉽게 코딩 하려고 노력했는데 합치니깐 좀 길어 보이네요.
[결과]
위 결과만 봐서는 잘 이해가 안 가실 거에요. main()함수 안에 코딩을 한줄과 결과창에 한줄씩 비교해가면서 어떻게 동작하는지 그 의미를 이해하시면 됩니다.
오늘의 핵심은 일반함수로 사용하는 함수를 friend 선언을 통해 클래스 접근 권한이 생기는 것이고, 클래스 간 friend 선언을 통해 서로의 클래스의 접근 권한이 생기는 원리를 이해하시면 됩니다. 함수의 경우는 함수의 경우는 상황에 따라 friend 선언을 통해 기존 클래스의 코딩을 회손하지 않고 특정 목적의 동작을 일반 함수로 구현 할 수 있어 사용 목적에 따라 유용한 표현입니다.