[C++] 프렌드(friend) 사용법 (함수, 클래스) 총정리

friend를 사용하는 이유

프렌드를 쓰는 이유는 친구나 동료처럼 수평적인 관계의 클래스간의 멤버 변수를 공유해야 할 경우 주로 쓰입니다. 예를 들면 하나의 클래스에서 다른 클래스의 내부 데이터에 접근 해야할 경우 프렌드를 써서 권한을 주는 경우를 예로 들수 있습니다. 이렇게 friend를 사용하면 자신의 개체뿐만이 아닌 다른 타입의 개체를 접근하는 것이 가능해지기 때문에 코드의 확장이 수월하게 이루어집니다. 단 이렇게 프렌드를 사용할 경우 개발자의 입장에서는 개발에 편리하겠지만 캡슐화 파괴의 주범이 되어 설계가 꼬여버리는 경우가 생길 수 있습니다. 클래스 내부에서만 써야할 멤버들이 다른곳에서 계속 접근을 허용하게 되면 데이터 보호도 어렵고 캡슐화를 지향하는 객체지향적 설계라고 보기 어렵겠죠. 프렌드는 가급적 남발하지 않고 필요한 경우에만 사용해주시는것이 좋겠습니다. (사용을 하지 말자는것은 아닙니다. 필요한곳에서는 당연히 사용하는것이 맞습니다.)

 

 friend 사용법 

friend는 함수나 클래스 선언 앞에 선언할 수 있습니다. 이렇게 friend를 선언한 함수나 클래스에서는 접근 제어 지시자(private, public, protected)의 영향을 받지 않습니다.

 

friend 함수

#include <iostream>
using namespace std;

class People{
private:
    string name;
public:
    People(string name) {this->name = name;} //생성자
    
    friend void sayName(People p); //friend함수
};

void sayName(People p) {
    //friend 함수이므로
    //접근 제어 지시자의 영향을 받지않고 
    //private 멤버에 직접 접근이 가능
    cout << p.name << endl;
}

void main() {
    People p("홍길동");
    sayName(p);
}

프렌드 사용 예제

People클래스의 sayName이라는 함수를 friend로 선언함으로써 sayName함수는 private로 되어있는 People클래스의 name에 직접적으로 접근을 할 수 있습니다.

 

friend 클래스

#include <iostream>
using namespace std;

class PeopleA{
private:
    string name;
    int height;
    friend class PeopleB; //friend 클래스 선언
public:
    //생성자
    PeopleA(string name, int height) {
        this->name = name;
        this->height = height;
    }
};

class PeopleB {
public:
    //friend 선언으로 인해 PeopleA의 private 멤버에 접근가능
    void info_A(PeopleA a) { 
        cout << "이름 : " << a.name << endl;
        cout << "신장 : " << a.height << endl;
    }
};

void main() {
    PeopleA a("홍길동",170);
    PeopleB b;
    b.info_A(a);
}

프렌드 클래스 예제

클래스에도 friend 예약어를 사용할 수 있습니다. 이렇게 하면 friend로 선언한 클래스의 전체가 접근 제어 지시자의 영향을 받지 않게 되므로 friend로 선언된 클래스의 모든 멤버와 메서드에 접근이 가능합니다. 위의 예제를 보시면 PeopleA 클래스에서 PeopleB클래스를 friend로 선언하였으므로 PeopleB클래스 내부에서 PeopleA클래스 멤버에 접근이 가능한것을 확인하실 수 있습니다.

댓글

Designed by JB FACTORY