멤버 접근
접근 지정자(참고 링크)를 통해 클래스 내의 멤버에 대해서 접근을 금지하거나 허용할 수 있었는데, private 나 protect 로 설정되어 접근이 막힌 클래스 멤버에 대해 클래스의 멤버 함수가 아니라 다른 함수에서 접근이 필요할 수 있다. 특히 서로 다른 클래스에 대한 연산을 함수로 구현한다면, 이때 사용되는 클래스들의 멤버 변수 접근이 막혀있는데, 접근이 필요할 수 있다. 멤버 변수 접근을 public 으로 풀어버릴 수도 있지만, 이 경우 클래스의 은닉성을 깨는 것이기 때문에 권장되지 않는다. 이때 사용하는 것이 friend 이다.
클래스 내에서 friend 를 이용하여 접근을 허용해주어 클래스에서 접근이 금지되었던 멤버에 접근할 수 있게 한다. 이때 전역변수, 다른 클래스의 멤버 함수, 다른 클래스 전체에 대해서 friend 선언을 해줄 수 있다.
friend
기본적으로 클래스 내부 아무 곳에나 friend 를 사용하여 선언해주면 된다. 참고로 friend 선언을 한다는 것 자체가 클래스 멤버 함수는 아니라는 뜻이다. 멤버 함수가 아니기 때문에 해당 클래스 객체에 . 을 사용하여 friend 선언된 함수에 접근하면 당연히 사용하지 못한다.
주의해야 할 점은 컴파일러를 위해 사용하는 클래스들을 코드 전면에 선언해주어야 할 수 있다. 컴파일러가 friend 를 만났는데, 해당 클래스가 선언되어 있지 않다면 오류가 발생하기 때문이다.
- 전역 함수 firend
class ClassName {
....
friend return_type function_name(parameter);
....
};
- 클래스 멤버 함수 friend
class ClassName {
....
friend return_type TargetClass::function_name(parameter);
....
};
- 클래스 friend
class ClassName {
....
friend TargetClass;
....
};
혹은
class ClassName {
....
friend class TargetClass;
....
};
'Language > C & C++' 카테고리의 다른 글
[C++] 클래스 상속(inheritance) 및 다중 상속 (0) | 2024.11.01 |
---|---|
[C++] 연산자 오버로딩(operator overloading) (0) | 2024.10.27 |
[C/C++] 헤더파일 분할 작성과 헤더파일 중복 선언 방지 (0) | 2024.10.13 |
[C++] 얕은 복사(shallow copy)와 깊은 복사(deep copy) 그리고 복사 생성자 (0) | 2024.10.13 |
[C++] 값에 의한 호출(call by value)과 주소에 의한 호출(call by address) 그리고 참조에 의한 호출(call by reference) (0) | 2024.10.13 |