Priv's Blog

friend 키워드 본문

Dev. Study Note/C++

friend 키워드

Priv 2024. 1. 10. 16:26

 


 

 

1. friend 키워드

friend 키워드는 수평적인 관계에 위치한 클래스 간의 멤버 변수를 공유하기 위해 주로 사용되는 키워드입니다.

타 클래스 내부에 접근하여 제한적으로 필요한 멤버 변수를 불러오는 기능을 하며, 확장성을 키울 수 있다는 장점이 있지만 캡슐화를 무시하므로 스파게티 코드가 만들어질 위험성이 따라옵니다.

#include <iostream>
using namespace std;


class People {
private:
    string name;
    int age;
public:
    string getName();
    int getAge();

    void setName(string name);
    void setAge(int age);

    string editInfo(string name, int age);

    void sayAge(People people);
};

void People::setName(std::string name) {
    People::name = name;
}

void People::setAge(int age) {
    People::age = age;
}

string People::getName() {
    return People::name;
}

int People::getAge() {
    return People::age;
}

string People::editInfo(string name, int age) {
    People::setName(name);
    People::setAge(age);

    return "Info Edited.";
}

void sayAge(People people) {
    cout << people.age << endl;    // ERROR!!
}


int main() {
    return 0;
}

위 코드에서 sayAge( ) 메서드의 내부 코드는 에러를 발생시킵니다.

people 객체의 Age 변수는 private로 선언되어 외부에서 접근이 불가능한 People 클래스의 멤버 변수입니다.

이때 아래와 같이 friend 키워드를 사용하면 에러를 해결할 수 있습니다.

#include <iostream>
using namespace std;


class People {
private:
    string name;
    int age;
public:
    string getName();
    int getAge();

    void setName(string name);
    void setAge(int age);

    string editInfo(string name, int age);

    friend void sayAge(People people);
};

void People::setName(std::string name) {
    People::name = name;
}

void People::setAge(int age) {
    People::age = age;
}

string People::getName() {
    return People::name;
}

int People::getAge() {
    return People::age;
}

string People::editInfo(string name, int age) {
    People::setName(name);
    People::setAge(age);

    return "Info Edited.";
}

void sayAge(People people) {
    cout << people.age << endl;
}



int main() {

    return 0;
}

이제 sayAge( ) 메서드에서 일어난 에러가 해결되었습니다.

friend 키워드를 사용할 경우, 클래스 외부에서 함수를 정의하여 구현하는 것이기 때문에 다른 함수와 다르게 People:: 키워드를 붙여서는 안 됩니다.

People:: 키워드는 People 클래스 내부의 함수를 정의할 때 사용하는 키워드이지만, friend sayAge( ) 함수는 People 클래스 내부에 직접 정의되어 있지 않고, friend 키워드를 통해 외부에서 정의하도록 되어 있습니다.

또한 friend 키워드를 사용했으므로 sayAge( ) 메서드는 People 클래스의 private 멤버 변수인 name, age에 접근할 수 있습니다.

 


 


수고하셨습니다!


'Dev. Study Note > C++' 카테고리의 다른 글

상속의 타입  (0) 2024.02.13
2D Array Row, Column  (0) 2024.01.23
클래스  (0) 2023.12.27
구조화된 바인딩  (0) 2023.12.24
C++의 하드웨어 대응  (0) 2023.12.17
Comments