Programming Language/C++

[C++] 클래스와 함수의 friend 선언

lumana 2024. 6. 29. 16:52

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