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

2024. 6. 29. 16:52·Programming Language(Sub)/C++

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(Sub) > C++' 카테고리의 다른 글

[C++ STL] std::string  (0) 2024.06.30
[C++ STL] std::pair  (0) 2024.06.30
[C++] 스마트 포인터  (0) 2024.06.28
[Modern C++] 함수 객체와 람다식  (0) 2024.06.28
[C/C++] 함수 포인터  (0) 2024.06.28
'Programming Language(Sub)/C++' 카테고리의 다른 글
  • [C++ STL] std::string
  • [C++ STL] std::pair
  • [C++] 스마트 포인터
  • [Modern C++] 함수 객체와 람다식
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (457)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (130)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (6)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[C++] 클래스와 함수의 friend 선언
상단으로

티스토리툴바