friend 선언(클래스, 함수)
- friend는 친구라는 의미를 가지고 있다.
클래스의 friend 선언
클래스를 friend로 선언한다는 것은 어떤 의미일까?
예를 들어 클래스 A와 B가 있다고 해보자. 이 때 클래스 A가 "클래스 B는 내 믿을만한 친구야."라고 컴파일러에게 알려준다. 그러면 클래스 B에서 클래스 A의 모든 멤버(private까지)를 접근할 수 있게 된다
- A 클래스가 B 클래스를 friend 클래스로 선언하면, B 클래스는 A 클래스의 private 멤버까지 직접 접근이 가능하다.
- a.GetX()가 아니라 a.x 이런식으로 직접 접근이 가능해진다
- 반대로 A 클래스가 B 클래스의 private멤버까지 직접 접근을 하기 위해서는 B 클래스에서 A 클래스를 frined 클래스로 선언해줘야 한다
- 즉, 클래스의 friend 선언은 private 멤버에 접근할 수 있는 클래스를 지정해주는 것이다
- 이는 OOP의 정보은닉(Encapsulation)에 위배되는 선언이므로, 가급적 사용하지 않는 것이 좋다.
example
#include <cstring>
#include <iostream>
using namespace std;
class B; // 컴파일러에게 먼저 classB가 있다는 것을 알려줘야 classA에서 classB를 frined로 선언할 수 있다
class A {
public:
A(int mynum) : num(mynum) {}
private:
int num;
friend class B;
};
class B {
public:
B(int mynum) : num(mynum) {}
void ShowAclass(A &frn) {
cout << "A의 private num은 " << frn.num << endl;
}
private:
int num;
};
int main(void) {
A a(3);
B b(5);
b.ShowAclass(a);
}
함수의 friend 선언
- 클래스와 마찬가지로 함수 또한 friend로 선언할 수 있다
- 비 멤버함수에서 객체의 private 멤버에 접근할 수 있게 된다
#include <iostream>
using namespace std;
class A {
public:
A(int mynum) : num(mynum) {}
private:
int num;
friend void ShowClass(const A&);
};
void ShowClass(const A& aclass) {
cout << "나의 Private num은: " << aclass.num << endl;
}
int main(void) {
A a(3);
ShowClass(a);
}
Ref) https://musket-ade.tistory.com/entry/C-클래스의-friend-선언-함수의-friend-선언
'Programming Language > C++' 카테고리의 다른 글
[C++] std::distance, std::advance (0) | 2024.07.01 |
---|---|
[Modern C++] std::move, std::forward (0) | 2024.06.30 |
[C++] 스마트 포인터 (0) | 2024.06.28 |
[Modern C++] 함수 객체와 람다식 (0) | 2024.06.28 |
[C/C++] 함수 포인터 (0) | 2024.06.28 |