본문 바로가기

C++ 기초 1

[C++] 3-5 프렌드 (friend) 함수 사용 이유 및 예제

프렌드 함수 

   프렌드 함수(friend function)는 클래스의 멤버 함수가 아니면서 클래스의 private 데이터 멤버에 접근할 때 사용하는 함수이다. 프로그래밍을 하다 보면 외부 함수에 특정 클래스의 private 데이터 멤버를 참조해야 하는 경우가 생긴다. 이때 외부 함수를 특정 클래스의 프렌드 함수로 선언하면 해당 클래스의 private 데이터 멤버들을 참조할 수 있다. 프렌드 함수를 사용하기 위해서는 함수의 원형 앞에 예약어 friend를 붙인다. 

   멤버 함수를 호출하면 그 멤버함수를 호출한 object의 시작 주소를 가리키는 포인터 this가 자동으로 전달되어 클래스 내에서는 데이터 멤버들을 직접 참조하는 것이 가능하다. 그러나 프렌드 함수는 this 포인터가 전달되지 않으므로 프렌드 함수 내에서 선언된 object 또는 매개변수 object로 데이터 멤버를 접근할 수 있다.

 

예제
#include <iostream>
using namespace std;
class eng;				//선행 선언
class math {			//첫 번째 클래스
private:
	char* name;
	int score;
public:
	math(char* n, int s);		//생성자 함수의 선언
	friend int add(math m, eng e);		//프렌드 함수의 선언
};
class eng {			//두 번째 클래스
private:
	char* name;
	int score;
public:
	eng(char* n, int s);	//생성자 함수의 선언
	friend int add(math m, eng e);	//프렌드 함수의 선언
};
math::math(char* n, int s)	//첫 번째 클래스의 생성자 함수의 정의
{
	name = n;
	score = s;
}
eng::eng(char* n, int s)	//두 번째 클래스의 생성자 함수의 정의
{
	name = n;
	score = s;
}
int add(math m, eng e)	//프렌드 함수의 정의
{
	return m.score + e.score;	//클래스 math와 클래스 eng 참조
}

int main()
{
	math m1((char *) "Hong", 95), m2((char*) "Lee", 100);	//객체 m1, m2 생성
	eng e1((char*) "Hong", 90), e2((char*) "Lee", 70);	//객체 e1, e2 생성
	cout << "Hong: " << "math+eng=" << add(m1, e1) << endl;	//프렌드 함수 호출
	cout << "Lee: " << "math+eng=" << add(m2, e2) << endl;	//프렌드 함수 호출
	return 0;
}
실행 결과
Hong: math+eng=185
Lee: math+eng=170
참고

1. 장인성 외 5인, (초보자도 쉽게 따라 할 수 있는) C++프로그래밍, 광문각, 2017.02.13