▶프랜드 클래스(friend class)
C++은 캡슐화의 은닉성으로 접근 지정자들을 제공합니다.
public 멤버들은 클래스의 외부에서도 접근이 가능하지만 private나 protected는 멤버에 대한
접근을 제한합니다.
그러나 어떤 경우에는 다른 클래스에서는 말고 친구(friend)에게만 클래스가 외부에 자신의 내부 데이터까지 사용할 수 있도록 허용하고 싶은 경우가 있습니다.
이 때. C++은 friend 키워드를 제공합니다.
선언하는 방법은 아래와 같습니다.
class 허용해주는_클래스명 {
friend class 허용받는_클래스명;
...
};
특징으로는 4가지가 있습니다.
- friend 선언은 클래스 내의 어떤 위치도 상관없다.
- 허용 받는 클래스는 허용해주는 클래스의 모든 멤버를 접근할 수 있다.
- 반드시 허용해주는 클래스에서만 선언할 수 있다.
- friend 선언은 상속되지 않는다.
물론 내부 데이터를 전달하는데 접근자(getter)나 설정자(setter)함수들을 만들어 이용할 수 있지만
번거롭습니다. 그리고 무조건 특정 클래스에만 줘야 된다면 friend 키워드를 이용해야 합니다.
▶프랜드 함수(friend function)
어떤 클래스가 다른 클래스의 멤버 함수가 아니라 일반 함수에서 많이 사용되는 경우가 있습니다.
friend가 붙은 모든 함수는 멤버 함수가 아니라 일반 함수입니다.
예를 들어, 두점 사이의 거리를 구하고, 여러 점의 x값이나 y값의 평균을 구하는 함수를 일반 함수로 구현한다면,
이들 함수에서는 Point의 여러 멤버들에 접근해야 할 것입니다.
friend는 이와 같이 일반 함수에게도 클래스의 private나 protected 멤버의 접근을 허용할 수 있습니다.
결론은 두 줄로 정리 할 수 있습니다.
- friend가 붙으면 멤버 함수여도 inline으로 구현된 일반 함수가 된다.
- friend가 붙은 일반 함수는 내부의 데이터에 접근할 수 있다.
friend클래스는 가급적 사용하지 말 것을 권장합니다.
friend함수도 같은 문제가 있기는 하지만 friend 클래스와는 약간 다릅니다.
연산자 중복 정의(operator overloading)에서 연산자 중복 함수를 내부 데이터를 접근하는
일반 함수로 만드는 등의 이유로 매우 흔하게 사용됩니다.
그렇기 때문에 friend 함수의 의미를 정확히 알아두어서 사용해야 합니다.
연산자 중복 정의는 많은 기반 지식이 필요하고 내용이 많기 때문에
정확한 이해를 위해 게임으로 배우는 c++책을 사서 보시는걸 추천 드립니다.
'C++ 프로그래밍 > 클래스' 카테고리의 다른 글
예외 처리 방법들 (1) | 2022.08.22 |
---|---|
예외 처리란? (1) | 2022.08.22 |
다형성-순수 가상 함수와 추상 클래스 (0) | 2022.08.22 |
다형성-가상 함수와 객체의 크기 (0) | 2022.08.22 |
다형성-가상 함수와 동적 바인딩의 의미 (0) | 2022.08.12 |