티스토리 뷰

Programming/C++

[c++]프렌드(friend)

쩨리쩨리 2018. 3. 14. 20:44
반응형

* 프렌드(friend)

클래스의 전용 멤버 변수들은 내부 데이터를 저장하고 있고 이것은 일반적으로 외부의 접근으로부터 은닉된다. 전용 멤버 변수들에 접근 할 수 있는 것은 멤버 함수 뿐이었다. 하지만 c++은 지정된 함수나 클래스에 한하여 내부 데이터에 접근할 수 있게 해주는 프렌드(friend)라는 기능을 제공한다. 즉 프렌드를 사용하면 프렌드로 지정한 하나의 클래스의 모든 멤버 함수는 내부 데이터를 참조할 수 있다.

 

내가 만약 하나의 클래스를 프렌드로 설정하면 클래스 안의 개체들이 접근지정자가 무엇이든 모든 것들을 쓸 수 있다. 하지만 그 클래스는 나에게 접근할 수 없다.

 

프렌드를 쓰는 이유는 주로 코드의 확장을 위함에 있다. 예를 들면 문법적으로 멤버 함수가 아닌 일반 함수가 클래스의 내부 데이터에 접근 해야할 경우 프렌드를 써서 권한을 주는 경우이다. 자신의 개체뿐만이 아닌 다른 타입의 개체를 접근하는 것이 접근성이 우위에 있기 때문에 코드의 확장이 수월하게 이루어 진다.

 

프렌드는 개발자의 입장에서 코드 작성이 더 수월하도록 도와주지만 캡슐화 파괴의 주범이 될 수도 있다. 내 클래스 안에서만 써야할 멤버들이 여러곳으로 확장을 하면 캡슐화를 지향하는 객체지향적 c++에서는 객체들이 여러곳으로 남발하여 사용되기 때문에 데이터 보호가 어렵다. 프렌드는 가급적 남발하지 않는 것이 좋다.

 

 

 

 

* 프렌드 종류

1. 프렌드 클래스(friend class) : 프렌드로 지정한 클래스의 멤버들은 지정한 곳의 클래스 멤버를 직접 참조할 수 있다.

2. 프렌드 함수(friend method) : 사용법이 번거로워 잘 쓰이지 않는다. 두 개의 객체를 비교할 때 많이 쓰인다.

3. 프렌드 외부함수(friend funtion) : 가장 많이 쓰인다. 두개의 객체를 가지고 연산을 하는 경우에 많이 쓰인다.

 

 

 

 

* 프렌드 특징

1. 지정할 개체의 시작부분에 friend를 명시한다.

2. 프렌드로 설정한 개체는 그 클래스의 멤버가 아니므로 public이나 private같은 접근지정자의 영향을 받지 않는다.

3. 프렌드 함수의 원형은 비록 클래스 안에 포함되어 있으나 멤버 함수는 아니며 프렌드 함수의 본체는 외부에서 따로 정의된다.

4. 프렌드 함수는 클래스 내부의 모든 멤버 변수를 사용할 수 있으며 어떤 멤버 함수도 호출이 가능하다.

 

 

 

 

* 프렌드 외부함수 코드로 프렌드를 이해해보자

 

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
#include<iostream>
#include<string>
using namespace std;
 
class B {
    int money;
public:
    void disp();//프렌드 멤버 함수        
};
 
class A {
    int money;
public:
    A(int pay=100000) {money = pay;}//초기값 10만으로 설정
    
    void setName(int pay) {money = pay;}
    
    int getMoney() const{return money;}
    //friend class B;//private 권한 파괴
    friend void B::disp();//안되는 이유:B를 인식못해서
};
 
void B::disp() {
    A aa;
    //cout<<aa.getMoney()<<endl;//상속상태에서만 쓸수 있는 
    cout << aa.money << endl;//상속관계가 아니지만 쓸수 있음
    //money는 원래 private 변수이지만 friend를 쓰면 private라도 접근가능하다.
}
 
void main() {
    B bb;
    bb.disp();
}
cs

 

 

* 풀이

A 클래스에서 B 클래스를 프렌드로 명시하여 B클래스는 A클래스 안의 모든 멤버들을 갖다 쓸 수 있다. 상속 관계가 아니더라도 프렌드만 선언하면 가능하다. 하지만 이때 주의할 점이 있다! A 클래스를 먼저 만든뒤 B 클래스를 아래에 만들었을때, 프렌드는 나중에 생긴 클래스를 인식하지 못한다. 따라서 프렌드를 선언할때 프렌드로 지정할 클래스를 먼저 만든 뒤 프렌드 선언하는것이 좋다.


 

 

 

 

 

반응형
댓글
공지사항