C, C++/C++ 언어 / / 2024. 5. 30.

[C++] friend 키워드 사용법 ( friend 함수, 클래스 )

접근 권한을 부여하는 friend 키워드

이 글은 예전에 작성한 글로, 다시 읽어보니 설명이 부족한 생각이 들어서, 이를 보완하는 새로운 글을 작성했습니다.

 

[C++] 접근 권한을 부여하는 friend 키워드

friend 함수friend 함수는 한 클래스에서, 그 클래스의 모든 멤버에 접근할 수 있는 권한을 부여한 함수를 말합니다.다음 예문은 이러한 friend 함수를 보여줍니다.#include using std::cout; // using 선언문cla

codingembers.tistory.com

 


friend 키워드

 

friend 키워드는 클래스의 멤버가 아닌 함수나 다른 클래스에게, 해당 클래스의 모든 멤버에 접근할 수 있는 권한을 부여하기 위하여 쓰입니다.

이 키워드는 권한을 주는 클래스 내에서 사용되고, 이 권한은 상속이 되지 않습니다.

또한, 접근 권한을 제어하기 위한 접근 지정자( public, protected, private )의 영향을 받지 않고, 클래스 내에 어떤 위치에서 선언돼도 상관이 없습니다. 

 

접근 지정자에 내용은 여기에 정리해 두었습니다.

 

[C++] 접근 지정자 public, protected, private 사용법

접근 지정자란접근 지정자란 클래스의 외부나 클래스를 상속받은 클래스에서 그 클래스의 멤버 변수나 함수에 접근 가능한지를 지정하는 키워드입니다. 접근 지정자는 public, protected, private가

codingembers.tistory.com

 

클래스를 상속하는 경우, 파생 클래스는 private 멤버에 대한 접근 권한이 없습니다.

그러나, friend 키워드를 받은 함수 또는 외부 클래스는 private 멤버에도 접근할 수 있습니다.

 

friend 함수

friend 함수는 클래스의 멤버 함수로 간주되지 않지만, 클래스의 모든 멤버에 접근할 권한을 가진 함수입니다.

 

전역 함수의 경우, friend 키워드를 사용하면 함수를 선언한 것처럼 처리되기 때문에, 전역 함수를 구현하기 전에 클래스 내에서 friend 선언을 할 수 있습니다.

class A{

    int m_nPrivate;	// private 멤버

    friend int GetPrivate( const A& obj);	// friend 함수 선언
};

int GetPrivate( const A& obj){	// friend 함수
    return obj.m_nPrivate;
}

int main(){

    A obj;    
    cout << GetPrivate(obj) << endl;

    return 0;
}

 

그러나 클래스의 멤버 함수 같은 경우, 컴파일러가 멤버 함수의 존재를 모르기 때문에 멤버 함수가 선언된 후에 friend 선언을 할 수 있습니다.

class SupportA;	// 클래스 존재만으로는 부족합니다

class A{

    int m_nPrivate;

    // error !! 함수의 정체를 모릅니다.
    friend int SupportA::GetPrivate( const A& obj);
};

class SupportA{

    int GetPrivate( const A& obj){
        return obj.m_nPrivate;
    }
};

 

제대로 작동하게 하려면, 클래스 A의 선언부가 SupportA 선언보다 나중에 와야 합니다.

class A;	// 클래스임을 알려줌

class SupportA{

public:	// 클래스 A에서 함수에 접근할 수 있어야 합니다.
    int GetPrivate( const A& obj);
};

class A{

    int m_nPrivate;

    friend int SupportA::GetPrivate( const A& obj); // friend 함수로 선언
};

// class A의 멤버를 알아야 하기 때문에, 외부에 구현
int SupportA::GetPrivate( const A& obj){
    return obj.m_nPrivate;
}

int main(){

    A obj;
    SupportA sObj;
    cout << sObj.GetPrivate(obj) << endl;

    return 0;
}

 

friend 클래스

friend 클래스는 그 클래스의 모든 멤버 함수가, friend로 지정한 클래스의 모든 멤버에 접근할 수 있는 권한을 받은 클래스입니다.

#include <iostream>
using namespace std;

class A{

    int m_nPrivate;

    friend class SupportA; // friend 클래스로 선언
};

class SupportA{

public:
    int GetPrivate( const A& obj){	// A 클래스의 모든 멤버에 접근 가능
        return obj.m_nPrivate;
    }

    void SetPrivate( A& obj, int val){ // A 클래스의 모든 멤버에 접근 가능
        obj.m_nPrivate = val;
    }
};

int main(){

    A obj;
    SupportA sObj;
    sObj.SetPrivate(obj, 10);

    cout << sObj.GetPrivate(obj) << endl;

    return 0;
}

위의 예에서 클래스가 friend로 지정되었기 때문에, GetPrivateSetPrivate 함수 모두 friend 함수와 같은 권한을 가지게 되었습니다.

 

 

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유