friend 키워드
friend 기능
* 접근지정자를 무효할 수 있는 예외적인 기능을 제공한다.
외부에서 private, protected 멤버를 접근할 수 있다.
* 클래스 선언에서 외부 클래스나 함수를 friend로 명시하면,
private나 protected 멤버 변수, 함수를 public처럼 접근할 수 있다.
* 자바에서 같은 package안에 있는 디폴드 접근지정자와 기능이 비슷하다.
friend 선언
// 외부 함수 선언
class Vector {
public:
friend void print_vector(Vector* vector);
Vector(int x, int y) { mX = x; mY = y; }
private:
int mX;
int mY;
};
void print_vector(Vector* vector) {
cout << "x: " << vector->mX << " /// y: " << vector->mY << endl;
}
int main() {
Vector* vector1 = new Vector(1, 2);
print_vector(vector1);
return 0;
}
* 외부 전역 함수 friend 선언
전역 함수인 print_vector()가 vector의 private 멤버 변수에 접근하고 있다.
friend <return_type> <function_name>(매개변수);
// 외부 함수 클래스안에서 정의
class Vector {
public:
friend void print_vector(Vector* vector) { cout << "x: " << vector->mX << " /// y: " << vector->mY << endl; }
Vector(int x, int y) { mX = x; mY = y; }
private:
int mX;
int mY;
};
int main() {
Vector* vector1 = new Vector(1, 2);
print_vector(vector1);
return 0;
}
* friend 함수를 클래스 내부에서 정의하고 있다.
클래스 내부에서 정의하고 있지만 멤버 함수가 아니라 외부 함수이다.
friend <return_type> <function_name>(매개변수) {함수 정의}
* 외부 클래스 선언
friend <class_name>;
* 외부 클래스에 특정 멤버 함수만 선언
friend <return_type> <class_name>::<function_name>(매개변수);
friend 특징
* friend는 전이되지 않는다.
A와 B = 친구 / B와 C = 친구
A와 C는 친구가 아니다.
* friend는 상속되지 않는다.
* 클래스 내부에서 friend 함수는 정의할 수 있지만, class는 정의할 수 없다.
* friend 선언은 접근지정자의 영향을 받지 않는다.
(private안에서 선언하든 public안에서 선언하든 똑같다.)
활용 (연산자 오버로딩)
* friend 키워드는 연산자 오버로딩에서 매우 유용하게 쓰인다.
(다른 클래스에 멤버 변수가 필요한 경우가 많다.)
class Vector {
public:
Vector(int x, int y) { mX = x; mY = y; }
friend ostream& operator<<(ostream& out, const Vector* vector);
private:
int mX;
int mY;
};
ostream& operator<<(ostream& out, const Vector* vector) {
out << "\nX = " << vector->mX << "\nY = " << vector->mY;
return out;
}
int main() {
Vector* vector1 = new Vector(1, 2);
Vector* vector2 = new Vector(3, 4);
cout << vector1 << vector2 << endl;
return 0;
}
귀여운 그림은 쭐어님이 그리셨습니다.
'C++' 카테고리의 다른 글
[C++] 가상 소멸자 (0) | 2022.07.02 |
---|---|
[C++] 동적 바인딩, 정적 바인딩 (1) | 2022.06.30 |
[C++] 객체 배열 생성 및 소멸 (Java와 다른점) (0) | 2022.06.22 |
[C++] C++에서 C 라이브러리 표기법 (0) | 2022.06.22 |
[C++] Namespace 네임스페이스 (4) | 2021.11.21 |