friend in C++ (cpp)
friend 키워드를 한번 알아보도록 하겠습니다~
friend 키워드는 전역 함수 클래스, 멤버 함수 앞에 사용할 수 있습니다.
private 멤버에 대한 접근은 내부 접근만 가능하고 외부 접근은 불가능하지만 friend 키워드에 의한 접근은 가능합니다.
또한 특정 클래스 입장에서 다른 전역 함수나 클래스 또는 다른 클래스의 멤버 함수를 자신의 friend 키워드로 선언할 수 있습니다. 꼭 friend 키워드를 설정한 함수에서만 접근 가능하니 유의해주시기 바랍니다.
friend 키워드의 참고사항 중 첫 번째는 friend 함수 선언의 위치를 확인해야합니다. 선언하는 영역(private, public)과 무관합니다. 두 번째로는 클래스 내에서 friend를 이용한 함수 선언 시에만 이 friend 키워드를 추가해야 합니다. 함수 정의 시에는 friend 키워드가 없어야 합니다. 즉, 함수 자체가 일반 전역 함수라는 뜻입니다. 마지막으로는 friend 키워드를 이용한 선언은 멤버 함수의 선언이 아니라는 점입니다. 단지 기존 함수에 대한 friend 키워드를 추가한 것뿐 객체를 통한 접근은 불가능합니다!!
간단한 예제를 한번 살펴보도록 하죠.
class classA
{
private:
/* data */
int x;
friend int func(classA &objA, int a);
};
int func(classA &objA, int a){objA.x = a;}
이 때
현재 private로 둘러싸인 func(classA, int) 함수를 friend 키워드를 이용해 밖에서 호출한 것을 볼 수 있습니다.
friend를 사용하지 않는다면 밖의 Center(CPoint, CPoint) 메서드에서 private안에 존재하는 x, y 변수를 호출할 수가 없습니다.
#include <iostream>
using namespace std;
class CPoint{
private:
int x;
int y;
public:
CPoint(int a = 0, int b = 0) : x(a), y(b){}
// Center 함수를 friend로 선언
friend void Center(CPoint P1, CPoint P2);
};
void Center(CPoint P1, CPoint P2)
{
CPoint P;
//private 멤버인 x,y에 접근가능해진다.
P.x = (P1.x + P2.x) / 2;
P.y = (P1.y + P2.y) / 2;
cout << "중심: " << "(" << P.x << ", " << P.y << ")" << endl;
}
int main(int argc, char const *argv[])
{
CPoint P1(1,2), P2(3,4);
Center(P1, P2);
return 0;
}
이 파일은 전방선언을 하여야 CController 안에서 CCar class를 호출할 수 있다는 걸 볼 수 있습니다.
#include <iostream>
using namespace std;
//전방선언
class CCar;
class CController {
private :
int price;
public :
CController(int p) : price(p){}
void TurnOn(CCar &car);
void TurnOff(CCar &car);
void SpeedChange(CCar &car, int v);
};
class CCar{
private :
bool OnOff;
int price;
int speed;
public :
CCar(int p) : OnOff(false), price(p), speed(0) {}
void PrintSpeed(){ cout << "현재속도 : " << speed << endl;}
friend class CController;
};
void CController::TurnOn(CCar &car)
{
car.OnOff = true;
}
void CController::TurnOff(CCar &car)
{
car.OnOff = false;
}
void CController::SpeedChange(CCar &car, int v)
{
car.speed += v;
}
요약
- private 맴버에 대한 접근은 내부 접근만 가능하고 외부 접근은 불가능하지만 friend에 의한 접근은 가능하다.
- 특정 클래스 입장에서 다른 전역 함수, 클래스, 다른 클래스의 멤버 함수를 자신의 friend 키워드로 선언 가능하다.
- friend 설정한 함수에서만 접근 가능하다.
참고사항
- friend 키워드는 함수 선언의 위치에 따라 변하는 것이 아니다. 선언하는 영역(private, public)과 무관하며 의미 동일하다.
- 클래스 내에서 friend 키워드 이용한 함수 선언 시에만 friend 키워드를 추가해야 한다. 그 외에 특별한 기능이 없다.
- friend 선언은 멤버 함수의 선언이 아니다. 단지 기존 함수에 대한 friend 선언일뿐 객체를 통한 접근 불가능하다.