'친구'에 해당되는 글 1건

  1. 2016.11.30 [C++] friend, 프렌드? 친구? 넌 무엇이냐.
2016. 11. 30. 11:57

안녕하세요. 게임개발자 놀이터 입니다.

오늘은 C++에서 자주 쓰이지 않는! (개인적인 기준입니다..! 전 지금까지 써본적이 없었어요) friend에 대해서 정리 해볼까 합니다.


먼저 friend의 뜻을 생각해볼까요? 제목에도 적어놨지만 [친구]라는 뜻을 가지고 있습니다. C++에서 friend를 선언하면 친구 관계가 되는 거랍니다.  클래스끼리 말이죠. 그것도 굉장히 [친한 친구]! 베스트프렌드! 라고 생각하시면 이해가 좀 쉬울꺼애요.


모두가 그런건 아니겠지만, 여기선 이렇게 생각해봅시다. 

'나는 내 친한친구에게 나의 모든걸 보여줘도 괜찮아.'

'내 친구에게는 숨기는게 없어'

라는 뜻으로 friend를 생각하면 됩니다.


즉, A클래스가 B클래스를 friend로 지정한다면 B클래스는 A클래스의 private 멤버나 함수까지 접근이 가능합니다.

여기서 B클래스도 A클래스를 friend로 지정한다면 서로간의 private멤버나 함수까지 접근이 가능합니다.

(물론 B클래스는 A클래스를 friend로 지정 안할수도있습니다. (일방적인 사랑) )


선언 방법은 클래스 내부에 friend 로 선언해주면 되는데 이때 위치는 private, protected, public 어디든 상관 없습니다.


1
2
3
4
5
6
7
8
9
10
11
12
class A
{
    // 어디든 상관 없다! 
private:
    friend B;
 
protected:
    friend B;
 
public:
    friend B;
}
cs


위 코드처럼 firend는 어디에 선언되든 상관없습니다. ( 위 코드에선 A클래스가 선언되기전 B클래스를 알고있다고 생각합시다.)


그럼 직접적인 사용 예를 한번 보겠습니다.


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
36
37
38
#include<iostream>
 
using namespace std;
 
class B;
 
class A
{
 
private:
    int value;
public:
    A(int data)
    {
        value = data;
    }
    friend B;
};
 
class B
{
public:
    void fb(A a){
        cout<<"*** B클래스 public 함수 ***"<<endl;
        cout<<"*** A클래스 priavte int value에 접근 : "<<a.value<<" ***"<<endl;
    }
};
 
int main()
{
    A a(10);
 
    B b;
 
    b.fb(a);
 
    return 0;
}
cs


위 코드에서 25번째줄을 봅시다.

인자로 받아온 클래스 A의 value값에 접근하고있습니다.

value값은 private라 일반적으로는 절대 접근 할 수 없습니다.


하지만 friend가 이를 가능하게 만들어 줍니다.


실행 결과는 다음과 같습니다.


즉 friend로 선언 받은 이상 A클래스의 모든걸 접근할 수 있다는 것입니다.


이처럼 friend는 언뜻보면 아무런 이상 없고 정말 편해 보이지만, 이 friend는 객체지향의 핵심중 하나인 '정보 은닉'을 깨부수는 행위를 일으키게 됩니다.


어떤 클래스라도 private에 넣어둔 이유가 분명이 있을텐데, 이를 무시하고 접근해서 원한다면, 수정을 해버릴수도 있죠.


그래서 전 friend를 써본적이 없습니다..


이상으로 friend관련 글을 이만 마칩니다.


감사합니다.




Posted by 시리시안