7.1 C++의 프렌드 개념

※ 프렌드 함수를 선언할 수 있는 경우


1) 클래스 외부에 작성된 함수를 프렌드로 선언
2) 다른 클래스의 멤버 함수를 프렌드로 선언
3) 다른 클래스의 모든 멤버 함수를 한번에 프렌드로 선언



1) 클래스 외부에 작성된 함수를 프렌드로 선언


※ 예제 1)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
class Rect; // forward decalaration. 이 라인이 없으면, 다음 라인에서 Rect를 참조하는 전방 참조(forward reference) 문제 발생
bool equals(Rect r, Rect s); // equals() 함수 선언
 
class Rect { // Rect 클래스 선언
    int width, height;
public:
    Rect(int width, int height)  {     this->width = width; this->height = height;    }
    friend bool equals(Rect r, Rect s); //프렌드 함수 선언
};
 
bool equals(Rect r, Rect s) { // 외부 함수
    if(r.width == s.width && r.height == s.height) return true
    else return false;
}
 
int main() {
    Rect a(3,4), b(4,5);
    if(equals(a, b)cout << "equal" << endl;
    else cout << "not equal" << endl;
}
cs



※ 전방 참조(forward reference)를 해결하기 위해 전방 선언(forward declaration)를 해주었다.



2) 다른 클래스의 멤버 함수를 프렌드로 선언


※ 예제 2)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;
 
class Rect; 
 
class RectManager { // RectManager 클래스 선언
public:
    bool equals(Rect r, Rect s);
};
 
class Rect { // Rect 클래스 선언
    int width, height;
public:
    Rect(int width, int height) { this->width = width; this->height = height; }
    friend bool RectManager::equals(Rect r, Rect s); // 프렌드 함수 선언
};
 
bool RectManager::equals(Rect r, Rect s) { // RectManager::equals() 구현
    if(r.width == s.width && r.height == s.height) return true
    else return false;
}
 
int main() {
    Rect a(3,4), b(3,4);
    RectManager man;
    
    if(man.equals(a, b)) cout << "equal" << endl;
    else cout << "not equal" << endl;
}
cs



3) 다른 클래스의 모든 멤버 함수를 한번에 프렌드로 선언



※ 예제 3)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
class Rect;
 
class RectManager { // RectManager 클래스 선언
public:
    bool equals(Rect r, Rect s);
    void copy(Rect& dest, Rect& src);
};
 
class Rect { // Rect 클래스 선언
    int width, height;
public:
    Rect(int width, int height)  { this->width = width; this->height = height; }
    friend RectManager; // RectManager 클래스의 모든 함수를 프렌드 함수로 선언
};
 
bool RectManager::equals(Rect r, Rect s) { // r과 s가 같으면 true 리턴
    if(r.width == s.width && r.height == s.height) return true
    else return false;
}
 
void RectManager::copy(Rect& dest, Rect& src) { // src를 dest에 복사
    dest.width = src.width;  dest.height = src.height;
}
 
int main() {
    Rect a(3,4), b(5,6);
    RectManager man;
    
    man.copy(b, a); // a를 b에 복사한다.
    if(man.equals(a, b)) cout << "equal" << endl;
    else cout << "not equal" << endl;
}
cs



※ 프렌드 선언은 클래스 내에 private, public 등 아무 위치에서나 가능하다.

'C++ > C++ 문법' 카테고리의 다른 글

#8-1 상속  (0) 2018.10.07
#7-B 연산자 중복  (0) 2018.10.07
#6 함수 중복과 static 멤버  (0) 2018.10.05
#5-B 복사 생성자  (0) 2018.10.05
#5-A 함수와 참조  (0) 2018.10.04