friend 키워드
friend 키워드는 그 뜻이 '친구'라는 뜻과 마찬가지로 class와 class 간에 친구(friend) 관계를 형성할 수 있도록 합니다.
A class와 B class 있고, 둘 다 private 멤버를 가지고 있다면 이 private 멤버는 외부에서 직접 접근할 수 없습니다. 그러나 A class에서 B class를 friend 키워드를 통해 친구로 지정하면 B class는 A class의 private 멤버에 직접 접근이 가능해집니다. 하지만 A class는 B class의 private멤버에 직접 접근이 불가능합니다. A class가 B class의 private 멤버에 직접 접근하려면 B class에서 A class를 친구로 지정해야 합니다.
조금 헷갈리실 수 있는데, 쉽게 설명하자면 자기 자신과 다른 사람이 있다고 합시다. 이때 내가 다른 사람의 의도와는 상관없이 다른 사람을 친구로 생각하고 그 사람의 물건을 빌릴 수 없지만, 내가 그 사람을 친구로 생각하고 있을 때 그 사람에게 내 물건을 빌려줄 수 있다.라고 생각하시면 쉬우실 겁니다.
friend 선언
friend 선언은 class 내부에 friend 키워드 다음에 친구로 지정할 class 또는 함수를 작성하시면 됩니다.
class Point
{
private:
friend [class name="" ||="" 함수의="" 원형=""]
public:
...
private:
...
};
위 코드처럼 friend를 선언하면 그 class 또는 함수는 friend를 선언한 class의 private 멤버에 직접 접근이 가능합니다.
friend 함수
함수를 friend로 선언하면 그 함수는 friend를 선언한 class의 private 멤버에 직접 접근이 가능해집니다.
class Point
{
private:
friend void ChangePrivate(Point &);
public:
Point(void) : m_i(0) {}
void PrintPrivate(void) {
printf("%d \n", m_i);
}
private:
int m_i;
};
void ChangePrivate(Point &i) {
i.m_i++;
}
int main()
{
Point sPoint;
sPoint.PrintPrivate();
ChangePrivate(sPoint);
sPoint.PrintPrivate();
return 0;
}
위 코드에서 ChangePrivate(Point &i)라는 함수에서 Point class의 private 멤버인 int형 변수 m_i에 직접 접근하여 값을 변경하고 있습니다. 원래라면 class의 private 멤버는 외부에서 접근이 불가능하기 때문에 error가 발생하지만 여기서는 Point class에서 ChangePrivate(Point &i) 함수를 friend로 선언하고 있기 때문에 가능합니다.
friend Class
A class에서 B class를 friend 선언하면 B class는 A class의 private 멤버에 접근이 가능해집니다.
class B;
class A
{
private:
friend B;
private:
int m_nData;
};
class B
{
private:
A m_cA;
public:
void func() {
m_cA.m_nData = 10;
printf("%d \n", m_cA.m_nData);
}
};
int main()
{
B cB;
cB.func();
return 0;
}
위 코드를 보면 A class가 B class를 friend로 선언하였고, B class는 private 멤버로 A class 변수를 가지고 있습니다. 그리고 func() 함수 안에서 A class의 private 멤버 변수 m_nData에 직접 접근하고 있습니다.
friend Class 멤버
A class에서 B class전체가 아닌 B class의 특정 멤버 함수에게 friend 선언을 할 수 있습니다.
class A {
public:
void func(B& b);
};
class B {
private:
int _b;
friend void A::func(B&);
};
void A::func(B& b) {
b._b = 10;
printf("%d \n", b._b);
}
int main()
{
A cA;
B cB;
cA.func(cB);
return 0;
}
위 코드에서 B class는 A class의 멤버 함수 func()를 friend 선언했습니다. 그래서 A class의 func 함수는 인자로 받은 B class의 private 멤버에 직접 접근이 가능합니다.
'C++' 카테고리의 다른 글
[C++]함수 포인터 와 Class (0) | 2018.02.28 |
---|---|
[C++]static 정적 변수와 Class (0) | 2018.02.27 |
[C++]Class의 기본 형태 (0) | 2018.01.30 |
[C++]순수 가상함수와 추상 클래스, 인터페이스(interface) (0) | 2018.01.30 |
[C++]Class 상속 (0) | 2018.01.30 |