Priv's Blog
friend 키워드 본문
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