일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 패스트캠퍼스
- albert
- 직장인자기계발
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
- 한번에끝내는Java/Spring웹개발마스터초격차패키지
- 알버트
- 직장인인강
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online
- R
- 패캠챌린지
- 패스트캠퍼스후기
- AI
- SKT
- Today
- Total
제주 탈출 일지
프렌드(friend) 본문
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; 와 같이 클래스가 존재한다는 표시를 해줘야 합니다.
추가로 모든 함수가 특정 클래스에 접근하는 것이 아니라면 멤버 함수만 프렌드로 지정하여 사용하면 됩니다.
'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 |