C++ friend 키워드
by luis lee
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
마찬가지로 template class 에서 매개변수로 friend 를 정의할때도 단독으로 사용해야하는것이다.
끝으로…
따라서 friend 키워드를 사용할 때 위의 사항을 유념해두고 사용하도록 해야겠다.
Subscribe via RSS