반응형
friend 선언
- 접근지시자에 관계없이 모든 멤버의 접근을 허용하는 선언이다.
※ 그렇기 때문에, 클래스의 friend 선언은 객체 지향의 정보 은닉 개념에 위배된다.
- friend는 사용되는 클래스에서 선언을 해줘야한다.
- friend 선언은 클래스나 특정 멤버함수, 전역함수를 대상으로 사용이 가능하다.
- 클래스 대상 friend
#include <iostream>
using namespace std;
class A
{
private:
int n1;
float f1;
public:
A(int i, float f) : n1(i), f1(f) { }
friend class B;
};
class B
{
private:
int n1;
float f1;
public:
B() { }
void Show()
{
cout << n1 << " / " << f1 << endl;
}
void Copy(A& a)
{
this->n1 = a.n1;
this->f1 = a.f1;
}
};
void main()
{
A a(10, 10.5f);
B b;
b.Copy(a);
b.Show();
//결과 : 10 / 10.5
}
- 멤버함수, 전역함수 대상 friend
#include <iostream>
using namespace std;
class Point;
class PointCalc
{
public:
PointCalc() { }
Point Add(const Point& p1, const Point& p2);
};
class Point
{
private:
int x, y;
public:
Point(int _x, int _y) : x(_x), y(_y) { }
//1. PointCalc의 Add 함수에 대해 friend선언을 하고있다.
friend Point PointCalc::Add(const Point& p1, const Point& p2);
//2. 전역함수에 대해 friend선언을 하고있다.
friend void ShowPoint(const Point& p1);
};
//1. 멤버함수 구현
Point PointCalc::Add(const Point& p1, const Point& p2)
{
return Point(p1.x + p2.x, p1.y + p2.y);
}
//2. 전역함수 구현
void ShowPoint(const Point& p1)
{
cout << "x : " << p1.x << " / y : " << p1.y << endl;
}
void main()
{
Point p1(10, 20);
Point p2(30, 40);
PointCalc pc;
ShowPoint(pc.Add(p1, p2));
//결과 : x : 40 / y : 60
}
friend 선언시 주의점
- 위에서 언급했듯이 friend선언을 하게되면 모든 멤버에 접근이 가능하게 되므로 객체지향의 은닉성을 위배한다.
- 얽혀있는 클래스의 관계를 풀기위한 friend선언은 더 큰 문제를 야기하므로 사용하지 않는것이 좋다.
- friend 선언의 좋은 예는 연산자 오버로딩을 할 시, 교환법칙을 성립시키기 위한 사용법이 있다.
반응형
'Stack > C++' 카테고리의 다른 글
C++ 네임스페이스(namespace), using (0) | 2021.12.12 |
---|---|
C++ 연산자 오버로딩 (0) | 2021.12.05 |
C++ 다중상속 (0) | 2021.11.22 |
C++ 멤버함수, 가상함수 동작원리 (0) | 2021.11.17 |
C++ 순수 가상함수, 추상 클래스 (0) | 2021.11.11 |