사자자리

[C++] 프렌드(friend) 본문

C++/C++ 이론

[C++] 프렌드(friend)

renne 2022. 8. 24. 21:35

https://coding-leo.tistory.com/153

 

[C++] 연산자 오버로딩

연산자 오버로딩 함수 오버로딩  - 다른 매개변수의 데이터형을 가진, 같은 이름의 함수를 여러 개 정의할 수 있다. 연산자 오버로딩  - 오버로딩의 개념을 연산자까지 확장하여, 연산자에 다중

coding-leo.tistory.com

 

프렌드(friend)

 - C++의 클래스에서 public에 선언된 함수 이외에도 private의 멤버로 접근할 수 있는 통로

 - 함수를 어떤 클래스에 대해 프렌드로 만들면, 그 함수는 클래스의 멤버 함수들과 동등한 접근 권한을 가진다.

 - 즉, 프렌드 함수는 어떤 클래스의 private의 멤버에 접근할 수 있게 된다.

 

프렌드 사용 이유

 - 지금까지, 클래스의 private 멤버는 public에 선언된 함수를 통해서 유일하게 접근할 수 있었다.

 - 어떤 클래스의 이항 연산자를 오버로딩하면 프랜드를 만들 필요성이 생긴다.

//main.cpp
#include <iostream>
#include "time.h"
using namespace std;
int main() {
	Time t1(2, 30);
	Time t2;

	t2 = t1 * 3;
}

 - 위의 경우처럼, Time 클래스 객체와 int형 변수의 연산을 통해 Time 클래스 객체에 값을 저장하려면, 두 변수가 모두 Time 클래스 객체가 아니므로  연산자 오버로딩으로는 해결할 수 없는 문제가 생긴다.

 

//time.h
#include <iostream>
#ifndef TIMEH
#define TIMEH
class Time {
private:
	int hours, mins;

public:
	Time();
	Time(int, int);
	void addHours(int);
	void addMins(int);
	Time operator+(Time&);
	Time operator*(int);	//operator*의 매개변수의 순서가 바뀌었을 때도 작동하게 하기 위해
	void show();
	~Time();

	//operator*는 클래스 선언 안에서 선언되었지만, 멤버 함수가 아니다.(멤버 연산자 사용 X)
	//operator*는 멤버 함수가 아니지만, 멤버 함수와 동등한 권한을 가진다.(private 멤버 변수에 접근 가능)
	friend Time operator*(int n, Time& t) {
		return t * n;
	}
};
#endif	// !TIMEH
//func.cpp
#include "time.h"

Time::Time() {
	hours = mins = 0;
}

Time::Time(int h, int m) {
	hours = h;
	mins = m;
}

void Time::addHours(int h) {
	hours += h;
};

void Time::addMins(int m) {
	mins += m;
	hours += mins / 60;
	mins %= 60;
};

Time Time::operator+(Time& t) {
	Time sum;
	sum.mins = mins + t.mins;
	sum.hours = hours + t.hours;
	sum.hours += sum.mins / 60;
	sum.mins %= 60;
	return sum;
};

void Time::show() {
	std::cout << hours << "시간 " << mins << "분" << std::endl;
}

Time::~Time() {
}

Time Time::operator*(int n) {
	Time result;
	long resultMin = hours * n * 60 + mins * n;
	result.hours = resultMin / 60;
	result.mins = resultMin % 60;
	return result;
}
//main.cpp
#include <iostream>
#include "time.h"
using namespace std;
int main() {
	Time t1(2, 30);
	Time t2;

	t2 = t1 * 3;	//인자의 순서가 바뀌어도 된다.
	cout << "방법1: ";
	t2.show();

	t2 = operator*(3, t1);	//인자의 순서가 바뀌면 안 된다.
	cout << "방법2: ";
	t2.show();
	return 0;
}

 

'C++ > C++ 이론' 카테고리의 다른 글

[C++] << 연산자 오버로딩  (0) 2022.08.24
[C++] 연산자 오버로딩  (0) 2022.08.24
[C++] this 포인터와 클래스 객체 배열  (0) 2022.08.17
[C++] 클래스 생성자와 소멸자  (0) 2022.08.17
[C++] 추상화와 클래스  (0) 2022.08.17
Comments