본문 바로가기

컴퓨터

4-6. friend 선언

전역 함수에 대한 friend 선언

private로 선언된 멤버 변수는 외부 접근이 허용되지 않는다. 그러나 friend 선언을 통해서 private으로 선언된 멤버 변수의 접근을 허용할 수 있다.

#include <iostream>
using std::cout;
using std::endl;

class Counter {
	int val;
public:
	Counter() {
		val = 0;
	}
	void Printf() const {
		cout << val << endl;
	}
	friend void SetX(Counter& c, int val); //friend 선언
};

void SetX(Counter& c, int val) { //전역함수
	c.val = val;
}

int main() {
	Counter cnt;
	cnt.Printf();

	SetX(cnt, 2002);
	cnt.Printf();
	return 0;
}

14: 전역 함수 void SetX(Counter& c, int val)를 friend 선언 하노라! 따라서 SetX 함수는 Counter 객체의 private 영역 접근이 허용이 된다. 

friend 선언은 private이나 public과 같은 접근 제어 키워드와는 상관이 없다. 따라서 클래스 내 어디서든 선언 가능하다.

클래스에 대한 friend 선언

friend 선언은 클래스들 간에도 가능하다.

#include <iostream>
using std::cout;
using std::endl;

class AAA {
private:
	int data;
	friend class BBB; //class BBB를 friend로 선언함!
};

class BBB {
public:
	void SetData(AAA& aaa, int val) {
		aaa.data = val; //class AAA의 private 영역 접근!
	}
};

int main() {
	AAA aaa;
	BBB bbb;

	bbb.SetData(aaa, 10);
	return 0;
}

friend 선언은 단방향성을 지닌다. AAA 클래스가 BBB 클래스를 friend 선언하고 있다. 따라서 BBB 클래스는 AAA 클래스의 private 영역 접근이 가능하다. 그렇다 해도, AAA 클래스가 BBB 클래스의 private 영역 접근이 허용되는 것은 아니다. 이것이 가능해지려면 BBB 클래스가 AAA 클래스를 friend 선언하기를 기대해야만 한다.

friend 선언의 유용성

friend 선언은 객체지향에서 중요시하는 "정보 은닉"에 위배되는 결과를 가져온다. friend 키워드를 적용할 적절한 시기는 연산자 오버로딩에서 거론될 것이다. 그러니 그 외에는 friend 키워드를 사용하지 말아야 한다.

'컴퓨터' 카테고리의 다른 글

strcmp(), compare()  (0) 2019.04.24
ofstream  (0) 2019.04.23
4-4 클래스와 배열  (0) 2019.04.10
4-2. 캡슐화(Encapsulation)  (0) 2019.04.09
4-1. 정보 은닉(Information Hiding)  (0) 2019.04.08