Friend는 영어로 친구라는 의미를 가지듯, 클래스에서 사용할 수 있는 friend 키워드도 비슷한 의미를 지닌다.
#include<iostream>
class B;
class A
{
int num;
friend B;
public:
A(int num)
{
this->num = num;
}
void Print()
{
std::cout << num << std::endl;
}
};
class B
{
int num;
public:
B(int num)
{
this->num = num;
}
void Print(A& a)
{
std::cout << a.num + num << std::endl;
}
};
int main()
{
A a(100);
B b(25);
b.Print(a);
return 0;
}
그림 1. 실행결과.
소소를 살펴보면 클래스 A 내에서 friend B라는 선언을 통해 B와 friend 관계에 있음을 명시했다.
이제 B 내부에서 A에 접근할 일이 생기면 A의 어떤 멤버든지 마음대로 접근이 가능해진다.
위에 class B를 먼저 선언해주고 나중에 구현하였는데,
이는 클래스 A가 정의된 시점에서 friend B라고 명시하여도 B에 대한 정보가 없어서 에러가 나기 때문이다.
friend 선언은 class내에 존재하는 어떤 접근제어 지시자 안에 위치하던 상관없다.
2. friend 함수
friend 키워드를 클래스 전체 이외에 특정 함수에만 한정 지을 수도 있다.
#include<iostream>
#include<string>
class Person;
void ChangeName(std::string, Person&);
class Person
{
friend void ChangeName(std::string, Person&);
std::string name;
int age;
public:
Person(std::string name, int age)
{
this->name = name;
this->age = age;
}
void ShowInfo()
{
std::cout << name << "(" << age << "세" << ")" << std::endl;
}
};
void ChangeName(std::string name, Person& p)
{
p.name = name;
}
int main()
{
Person p("김철수", 123);
p.ShowInfo();
ChangeName("홍길동", p);
p.ShowInfo();
return 0;
}
그림 2. 실행결과.
소스를 보면 ChangeName이라는 함수에 한정 지어 Person클래스 내에서 friend 선언을 한 것을 볼 수 있다.
ChangeName 함수 내에서는 Person클래스의 private 멤버인 name에 접근하고 있는 것을 볼 수 있다.
위의 예제는 전역 함수에 friend 키워드를 사용했지만, 다른 클래스의 메서드에도 적용 가능하다.