프로그래밍 지식/C++

C++문법/ 프렌드, Friend 키워드

게임이 더 좋아 2021. 12. 6. 21:43
반응형
728x170

 

 

객체의 신뢰성과 객체지향의 원리에 따라 

Encapsulation, Inheritance는 지켜져야 한다.

그러나 너무 엄격하게 상속이나 캡슐화로 비효율적인 경우도 있다.

이럴 때는 진짜 조그마한 예외를 두어 융통성을 늘릴 수 있게 했다.

 

friend 키워드를 쓰면 특정 대상에 대해 모든 멤버를 공개할 수 있다.

-> friend를 선언한 대상에게 내 모든 것을 공개한다는 말이다.

 

프렌드로 지정되면 액세스 지정자에 상관없이 모든 멤버를 읽을 수 있다.

프렌드는 전역 함수, 클래스, 멤버 함수의 세 가지 수준에서 지정한다.

차례대로 살펴보자


 

1. 외부 전역 함수

외부의 전역 함수를 프렌드로 지정할 때는 클래스 선언문 안에 원형을 밝히되 friend지정자를 붙인다.

예를 들어서 sub함수를 Some 클래스의 프렌드로 지정하려면 

class Some
{
    friend void sub();
    ....
};

 

Some 클래스 안에 sub 함수 앞에 friend 키워드를 붙인다.

-> Some 클래스의 멤버변수들은 모두 friend 인 sub 함수가 접근할 수 있다.

 

클래스 내부에 sub 원형이 선언되어 있지만 

sub가 해당 클래스에 대해 friend 선언되어있다는 뜻이지 실제 본체는 Some 클래스 밖에 있다.

프렌드 키워드로 지정된 함수는 해당 클래스의 모든 멤버를 자유롭게 접근할 수 있다.

 


 

2. 클래스

두 개의 클래스가 서로 밀접한 관계라서 참조해야 할 때

클래스를 통째로 프렌드로 지정한다.

클래스 내부에 

friend로 지정할 클래스의 이름을 밝힌다.

예를 들어서 Any 클래스를 Some 클래스의 프렌드로 지정하고 싶다면?

class Some
{
    friend class Any;
    ...
    
    
};

Some 클래스 안에  Any 클래스가 friend로 선언됨

-> Any 클래스가 Some의 모든 멤버들을 자유롭게 접근가능

 


 

3. 멤버 함수

 

클래스끼리 프렌드가 되는 것은 양쪽의 멤버를 공유하는데 편리할 지는 모르겠으나

너무 허용하는 범위가 많아서 객체지향에 어긋나는 방법이며 위험하다.

그래서 특정 멤버 함수에 대해서만 프렌드로 지정할 수 있게 한다.

Some 클래스에 Any의 sub 함수만 프렌드로 지정해보자

class Some
{
    ....
    friend void Any::sub(Some &S);
    
};

 

Some 클래스 안에 Any의 sub 함수가 friend로 선언됨

-> Any의 sub 함수가 Some 클래스의 멤버에 모두 접근 가능

 

 


 

위를 보다보면 friend가 약간 이상한 점이 있다.

Any는 Some 클래스를 이용하는데 Some은 Any를 이용한다고 하지 않았다.

맞다.

사실 프렌드 지정은 단방향이다.

 

그리고 친구의 친구는 친구다. 라는 인간관계는 여기서 허용하지 않는다.

-> friend를 한다고 friend 클래스의 관계가 전해지는 것은 아니다.

 

friend로 선언해야만 단방향 친구이다.

그러므로 상위 클래스에서 friend로 선언했다고 해서 하위클래스가 자동으로 friend로 되지는 않는다.

-> 부모님 친구가 내 친구가 아니듯이 말이다.

반응형
그리드형