제주 탈출 일지

프렌드(friend) 본문

C++

프렌드(friend)

귀건 2020. 8. 11. 19:17
728x90
반응형

C++에서, 객체의 멤버를 접근하기 위해서 public의 함수를 통해서 접근하는 것이 일반적이다.

프렌드 제어 키워드는 객체 바깥의 함수같은 경우도 멤버에 접근해야 하는 경우가 필요하다.

이 프렌드 키워드를 통해 지정한 객체의 멤버에 접근할 수 있는 권한을 부여해줄 수 있다.

 

선언 방식은 다음과 같다.

friend 클래스이름 함수이름(매개변수목록); // 함수에 원형에서만 사용.

 

+ 프렌드 선언은 아무곳이나 해도 상관없다(public, private, protected)

해당 프렌드 선언은 객체지향에서의 '정보 은닉'을 깨버리기 때문에 특별한 경우가 아닐경우 지양하여야 한다.

 

*일반적으로 클래스 관련 이항 연산자를 오버로딩할 때 프렌드의 필요성이 자주 발생한다.

예시는 http://tcpschool.com/cpp/cpp_encapsulation_friend

에서 소스코드를 가져왔다.

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com


#include <iostream>
using namespace std;

class Rect
{
private:
double height_;
double width_;
public:
Rect(double height, double width); // 생성자 
void DisplaySize();
Rect operator*(double mul) const;
};

int main(void)
{
Rect origin_rect(10, 20);
Rect changed_rect = origin_rect * 2;
// Rect changed_rect = 3 * origin_rect; 

changed_rect.DisplaySize();
return 0;
}

Rect::Rect(double height, double width)
{
height_ = height;
width_ = width;
}

void Rect::DisplaySize()
{
cout << "이 사각형의 높이는 " << this->height_ << "이고, 너비는 " << this->width_ << "입니다." << endl;
}

Rect Rect::operator*(double mul) const
{
return Rect(height_ * mul, width_ * mul);
}


Rect changed_rect = origin_rect * 2; (객체 * 숫자)
// Rect changed_rect = 3 * origin_rect; (숫자 * 객체)

이 부분에서 주석쳐진 부분은 연산자 오버로딩에서 정의된 순서와 다르므로 오류가 난다.(숫자 * 객체)

따라서 해당 연산자 오버로딩 함수를 프렌드로 정의하여 숫자 * 객체 연산도 수행할 수 있도록 한다.

Rect operator*(double mul, const Rect& origin) { return origin * mul; 

origin * mul; 이경우 이전의 연산자 오버로딩의 함수가 제대로 작동할 수 있게 된다. 

+ 함수 원형 마지막 const 키워드는 읽기 전용 "상수 멤버 함수" 정의를 의미한다.

 

프렌드 클래스

클래스끼리 서로 밀접한 관계에 있고, 상대방의 private 멤버에 접근해야 하면, 클래스 자체를 프렌드로 선언하는 것이 좋다. A와 B 클래스에서 B클래스를 A의 프렌드 클래스로 지정한다면, B는 A의 멤버에 접근할 수 있는 권한이 있으나, A는 B의 멤버에 접근할 수 없습니다.(전방선언 필요)

 

선언은 다음과 같습니다.

friend class 클래스이름;

 

만약 B클래스를 프렌드로 선언하려 하는데 B가 A보다 나중에 정의되어 있다면, 

class B; 와 같이 클래스가 존재한다는 표시를 해줘야 합니다.

 

추가로 모든 함수가 특정 클래스에 접근하는 것이 아니라면 멤버 함수만 프렌드로 지정하여 사용하면 됩니다.

728x90
반응형

'C++' 카테고리의 다른 글

스마트 포인터(smart pointer)  (0) 2020.08.18
템플릿 (함수, 클래스)  (0) 2020.08.17
추상 클래스(abstract class)  (0) 2020.08.17
오버라이딩(overriding)  (0) 2020.08.14
파생 클래스  (0) 2020.08.13
Comments