freind 키워드를 사용하는 두가지 방법

friend 키워드를 사용하는 경우는 다른 class 에서 해당 클래스 맴버함수나 맴버, 혹은 전체에 접근을 허용할때이다.

그런데 소스코드를 보던 중 friend 의 사용법이 약간 다른 모습을 볼 수 있었다.

friend class MyClass;

friend MyClass;

필자는 friend 키워드가 어떤 역할을 하는지는 설명하지 않겠다.(잘 쓴 글이 훨씬 많이 있기 때문에…ㅠㅠ)

대신 이 두개의 차이점이 무엇인지에 대해서 설명하고자한다.

friend class myClass;

해당 사이트 를 확인해보면 friend 키워드에 대해서 자세하게 정리해놨다.

한글 번역이 너무 이상해서 영문으로 보는것을 추천한다.


class OutsiderClass{
    ...
    friend class InssaClass;
};

다음과 같이 정의한 경우를 생각해보자.

InssaClass(인싸클래스)는 친구가 많아서 OutsiderClass(아싸클래스) 라는 친구가 있는거다.

아싸 클래스는 인싸클래스에게 친구의 권한을 부여했기 때문에 자신이 가진 public,protected,private 맴버함수/변수에 접근권한을 준다.

근데 다음과 같이 friend 를 지정을 해주려고 했는데 InssaClass 라는 클래스가 없었다면 어떻게될까?

이 경우에는 InssaClass 를 declare 하게된다. 즉, 없다면 새로 만들고 있다면 갓다가 쓰는거다.

그렇기 때문에 InssaClass 가 있건 없건 상관이 없다. 물론 있어야 제 기능을 하겠지만 말이다.

friend myClass

이런 식의 friend 키워드의 사용법은 위에서 말했던 것과 다른점이 하나가 있다.

class OutsiderClass{
    ...
    friend InssaClass;
};

만약에 여기에서 InssaClass 가 어디에도 정의되어있지 않다면 어떻게 될까?

error C2433 라는 에러가 난다.

따라서 코드를 다음과 같이 수정해야한다.

class InssaClass{...};
class OutsiderClass{
    ...
    friend InssaClass;
};

즉, friend 만 단독으로 사용했을 경우에는 인싸클래스가 무조건 존재해야한다는 조건이 붙게된다.

이러한 조건을 걸어놓은 이유를 참고한 사이트에서 힌트를 얻을 수 있었는데, 바로 template class 와 friend 로 typedef 를 사용하는 경우에서였다.

class InssaClass {};
typedef InssaClass Inssa;

class OutsiderClass
{
    friend Inssa; // OK
    friend class Inssa // Error C2371 -- redefinition
};

이렇게 typedef 로 사용된 경우는 재정의 에러가 난다. 따라서 friend 만 단독으로 사용해야한다.

template class my_class { friend T; //... };

마찬가지로 template class 에서 매개변수로 friend 를 정의할때도 단독으로 사용해야하는것이다.

끝으로…

따라서 friend 키워드를 사용할 때 위의 사항을 유념해두고 사용하도록 해야겠다.