강께르의 개발일지
[C++] friend 키워드 본문
- 연산자 오버로딩을 공부하던 중, 전역 함수로 연산자 오버로딩을 위해 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 멤버를 접근할 수 있도록 열어주는 것이다.
- 그럼 왜 쓰는 것일까? 정보은닉을 무너뜨리는 문법이기 때문에 코드가 꼬이고 클래스 관계가 얽히는 것을 감당할 수 없다면 가급적 사용하지 않는 게 좋다. 문법적으로 이해만 하고 사용하지 않는 방향으로 연습하다가 사용해야 할 기준이 생길 때 사용하는 것이 좋다. 그 예는 연산자 오버로딩이다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 템플릿에 대해(함수 템플릿) (0) | 2021.06.17 |
---|---|
[C++] 연산자 오버로딩에 대해_2 (0) | 2021.06.17 |
[C++] 연산자 오버로딩에 대하여_1 (0) | 2021.06.16 |
[C++] 다중 상속과 가상 상속 (0) | 2021.06.16 |
[C++] 클래스의 상속(가상 함수와 다형성) (0) | 2021.06.16 |