강께르의 개발일지

[C++] friend 키워드 본문

프로그래밍/C++

[C++] friend 키워드

강께르 2021. 6. 16. 23:57

- 연산자 오버로딩을 공부하던 중, 전역 함수로 연산자 오버로딩을 위해 friend 키워드가 사용된다는 것을 알았다.

- 이를 정리하고 연산자 오버로딩을 계속 정리하려고 한다.

 

1. friend 키워드

- friend 키워드는 멤버로 선언된 특정 클래스나 함수에게 붙여 그들에게 private처럼 접근이 불가능한 멤버를 공개한다는 의미이다.

- friend 선언은 어디에 있든지 상관없다. public이든 private든 상관없다. 그렇게 선언된 변수인 클래스나 함수는 그 클래스의 private 멤버에 접근할 수 있다는 것이다. 이는 정보은닉이라는 특징을 무너뜨리는 것이기도 하다.

class Point
{
private:
	int xPos;
	int yPos;
public:
	Point(int x = 0, int y = 0)
		: xPos(x), yPos(y)
	{ }

	friend Point operator+(const Point& pos1, const Point& pos2);
};

Point operator+(const Point& pos1, const Point& pos2)
{
	return Point(pos1.xPos + pos2.xPos, pos1.yPos + pos2.yPos);
}

Point pos1(3, 4);
Point pos2(4, 5);
Point pos3 = operator+(pos1, pos2);
Point pos3 = pos1 + pos2;

- 전역함수 연산자 오버로딩을 다시 가져왔다. friend의 특성을 기억하며 분석해보자.

- friend 선언은 어디에 있든 상관없다. 이 경우엔 함수를 friend로 public에 선언하여 Point에 속하지 않은 모습이다.

- 그리고 전역함수로 정의하는 모습을 보자. 반환값을 Point 객체를 생성해서 전달하려고 한다. 그런데 매개변수를 보니 pos1의 private 멤버인 xPos와 yPos에 접근하여 사용하는 것을 볼 수 있다. pos2도 마찬가지이다.

- 이처럼 friend 키워드는 접근 제어 지시자를 무시하고 friend가 선언된 클래스나 함수에게 그 클래스의 private 멤버를 접근할 수 있도록 열어주는 것이다.

 

- 그럼 왜 쓰는 것일까? 정보은닉을 무너뜨리는 문법이기 때문에 코드가 꼬이고 클래스 관계가 얽히는 것을 감당할 수 없다면 가급적 사용하지 않는 게 좋다. 문법적으로 이해만 하고 사용하지 않는 방향으로 연습하다가 사용해야 할 기준이 생길 때 사용하는 것이 좋다. 그 예는 연산자 오버로딩이다.