본문 바로가기
C++

[C++]friend 키워드

by Junk_Seo 2018. 2. 21.
반응형

friend 키워드

friend 키워드는 그 뜻이 '친구'라는 뜻과 마찬가지로 class와 class 간에 친구(friend) 관계를 형성할 수 있도록 합니다.

A class와 B class 있고, 둘 다 private 멤버를 가지고 있다면 이 private 멤버는 외부에서 직접 접근할 수 없습니다. 그러나 A class에서 B class를 friend 키워드를 통해 친구로 지정하면 B class는 A class의 private 멤버에 직접 접근이 가능해집니다. 하지만 A class는 B class의 private멤버에 직접 접근이 불가능합니다. A class가 B class의 private 멤버에 직접 접근하려면 B class에서 A class를 친구로 지정해야 합니다. 

 

조금 헷갈리실 수 있는데, 쉽게 설명하자면 자기 자신과 다른 사람이 있다고 합시다. 이때 내가 다른 사람의 의도와는 상관없이 다른 사람을 친구로 생각하고 그 사람의 물건을 빌릴 수 없지만, 내가 그 사람을 친구로 생각하고 있을 때 그 사람에게 내 물건을 빌려줄 수 있다.라고 생각하시면 쉬우실 겁니다.

friend 선언

friend 선언은 class 내부에 friend 키워드 다음에 친구로 지정할 class 또는 함수를 작성하시면 됩니다.

class Point
{
private:
	friend [class name="" ||="" 함수의="" 원형=""]
public:
	...
private:
	...
};

위 코드처럼 friend를 선언하면 그 class 또는 함수는 friend를 선언한 class의 private 멤버에 직접 접근이 가능합니다.

friend 함수

함수를 friend로 선언하면 그 함수는 friend를 선언한 class의 private 멤버에 직접 접근이 가능해집니다.

class Point
{
private:
	friend void ChangePrivate(Point &);
public:
	Point(void) : m_i(0) {}
	void PrintPrivate(void) {
		printf("%d \n", m_i);
	}

private:
	int m_i;
};

void ChangePrivate(Point &i) {
	i.m_i++;
}

int main()
{
	Point sPoint;
	sPoint.PrintPrivate();
	ChangePrivate(sPoint);
	sPoint.PrintPrivate();
	return 0;
}

위 코드에서 ChangePrivate(Point &i)라는 함수에서 Point class의 private 멤버인 int형 변수 m_i에 직접 접근하여 값을 변경하고 있습니다. 원래라면 class의 private 멤버는 외부에서 접근이 불가능하기 때문에 error가 발생하지만 여기서는 Point class에서 ChangePrivate(Point &i) 함수를 friend로 선언하고 있기 때문에 가능합니다.

friend Class

A class에서 B class를 friend 선언하면 B class는 A class의 private 멤버에 접근이 가능해집니다.

class B;

class A
{
private:
	friend B;
private:
	int m_nData;
};

class B
{
private:
	A m_cA;

public:
	void func() {
		m_cA.m_nData = 10;
		printf("%d \n", m_cA.m_nData);
	}
};

int main()
{
	B cB;
	cB.func();
    return 0;
}

위 코드를 보면 A class가 B class를 friend로 선언하였고, B class는 private 멤버로 A class 변수를 가지고 있습니다. 그리고 func() 함수 안에서 A class의 private 멤버 변수 m_nData에 직접 접근하고 있습니다.

friend Class 멤버

A class에서 B class전체가 아닌 B class의 특정 멤버 함수에게 friend 선언을 할 수 있습니다.

class A {
public:
	void func(B& b);
};

class B {
private:
	int _b;
 
	friend void A::func(B&);
};

void A::func(B& b) {
	b._b = 10;
	printf("%d \n", b._b);
}    

int main()
{
	A cA;
	B cB;
	cA.func(cB);
    return 0;
}

위 코드에서 B class는 A class의 멤버 함수 func()를 friend 선언했습니다. 그래서 A class의 func 함수는 인자로 받은 B class의 private 멤버에 직접 접근이 가능합니다.

반응형

'C++' 카테고리의 다른 글

[C++]함수 포인터 와 Class  (0) 2018.02.28
[C++]static 정적 변수와 Class  (0) 2018.02.27
[C++]Class의 기본 형태  (0) 2018.01.30
[C++]순수 가상함수와 추상 클래스, 인터페이스(interface)  (0) 2018.01.30
[C++]Class 상속  (0) 2018.01.30