본문 바로가기
프로그래밍/C++

friend

by 리뷰하는 (게임)프로그래머_리프TV 2010. 3. 21.




private로 선언된 class 변수를 외부에서 조작 하기 위해 사용.


#include <iostream>

class AAA
{
	int n;
public:
	// SetN이라는 함수에 대해서 friend 선언
	friend void SetN( AAA& a, int n );
	void PrintN()
	{
		std::cout << n << std::endl;
	}
};

// SetN은 AAA클래스와는 별개의 전역 함수이다.
void SetN( AAA& a, int n )
{
	// 하지만 AAA클래스의 private안에 있는 맴버 변수를 수정하고 있다.
	a.n = n;
}

void main()
{
	AAA a;
	// 문제 없이 실행 된다.
	SetN(a, 10);
	a.PrintN();
}



friend 선언에 대해선 몇가지 더 존재 한다.
전역 함수에 대해 선언도 가능하지
만 클래스 or 클래스 안에 특정 맴버 함수에 대해서도 허용이 가능하다.



클래스에 friend 선언하기

#include <iostream>

class AAA
{
	int n;
	friend class BBB;	// BBB클래스에 대해서 friend 선언
};

class BBB
{
public:
	// 외부에서 BBB 클래스를 통해서 AAA클래스의 private의 값을 조정할 수 있다.
	void SetAAA_N(AAA& a, int n)
	{
		a.n = 10;
		std::cout << a.n << std::endl;
	}
};

void main()
{
	AAA aaa;
	BBB bbb;

	// BBB클래스에서 AAA를 조작
	bbb.SetAAA_N(aaa, 10);
}




그리고 마지막으로 friend선언을 맴버 함수만 해주는 것이 존재 하는데
이게 참 까다롭다.
전방 참조도 해줘야 하고,
일단 예제를 보자.
난 솔직히 잘 모르겠다.
friend 선언을 잘 안해서 그런것 일 수도 있지만
알것 같으면서도 애매하다


#include <iostream>

class BBB;		// 전방 참조.

// 클래스 AAA는 BBB에 private로 선언된 int n에 대해서 접근을 하고 싶어 한다.
class AAA
{
public:
	// 전방 참조가 없으면 BBB가 있는지 조차 모르기 때문에 전방 참조는 꼭 해줘야 한다
	// SetBBB_N이라는 함수는 public:을 해주지 않으면
	// 정작 BBB에서 friend 선언에 대한 컴파일 오류를 일으킨다.
	// friend는 당방향이라는 것을 기억하자.
	void SetBBB_N( BBB& a, int n );		// BBB에 n값을 수정하기 위한 함수
};

class BBB
{
	int n;
	// AAA에 존재 하는 SetBBB_N이라는 함수를 friend 선언
	// friend를 해주는 곳에선 public:이든 private: 든 상관없다.
	friend void AAA::SetBBB_N( BBB& a, int n );
};

// 함수 또한 클래스 내부에 선언과 정의를 동시에 해주는 것 또한 안된다.
void AAA::SetBBB_N( BBB& a, int n )
{
	// BBB 클래스에 n이 있는지 없는지 조차 모르기 때문이다.
	a.n = n;
	std::cout << a.n << std::endl;
}

void main()
{
	AAA aaa;
	BBB bbb;

	aaa.SetBBB_N(bbb, 10);
}


좀더 많이 배우고 느껴야 겠지만
friend라는건 참 모호하다
뭐든 잘쓰면 좋고 못쓰면 독이지만
이녀석은 그 영향을 더 잘 타는 것 같다.