10. 클래스의 활용(2) - 프렌드 함수

WanJu Kim·2022년 12월 10일
0

C++

목록 보기
45/81

클래스의 private에는 누가 접근이 가능한가? 오직 멤버 함수뿐이다. 하지만 이게 너무 엄격해서, 접근 범위를 넓히려고 한다. 그리고 그걸 '프렌드'라고 부르겠다. 프렌드에는 종류가 3개 있다.
1) 프렌드 함수
2) 프렌드 클래스
3) 프렌드 멤버 함수
여기서는 프렌드 함수만 알아보겠다.

그런데 프렌드 함수는 왜 필요한가? 우리는 전 단원을 통해 연산자 오버로딩을 배웠다. 연산자 오버로딩을 통해 가령 이런 구문이 가능해졌다.

A = B * 2.5;	// A,B는 객체.

근데 위 코드의 순서가 바뀌어도 가능한가?

A = 2.5 * B;

불가능하다. 왜? 왼쪽 피연산자의 멤버 함수를 통해 오른쪽 피연산자를 매개 변수로 넣고 작업을 하기 때문이다. 숫자 2.5한테 멤버 함수는 없다. 이게 가능하려면 어떻게 해야 할까? 멤버 함수가 아니라 일반 함수를 만들어야 한다. 멤버 함수가 아닌 함수는 객체를 사용하여 호출하지 않는다.(이거 헷갈림 조심.)

A = operator*(2.5, B);

근데 또 문제가 생긴다. private에 접근할 권한이 있는 함수는 멤버 함수밖에 없었다. 그러니 이런 일반 함수는 접근할 수 없는 것이다. 이런 문제를 해결하기 위해 friend 함수가 나왔다. 프렌드 함수는 다음과 같이 생성한다.

Student.h
class Student
{
public:
	...
	friend Student operator*(double m, const Student& s);
private:
	...
};

클래스 선언 안에 해야 한다. 프렌드 함수는 두 가지 특징이 있는데, 클래스 안에 선언되었음에도 불구하고 멤버 함수가 아니다. 하지만 멤버 함수와 동등하게 접근 권한을 가진다. 함수 작성은 다음과 같이 한다.

Student operator*(double m, const Student& s)
{
	Student result;
    result.name = s.name;
    result.age = s.age + m;
    return result;
}

멤버 함수가 아니라서 'Student::'가 없다. 또한 'friend'도 없다. 이렇게 하면 순서에 관계 없이 연산자 계산이 가능하다.

profile
Question, Think, Select

0개의 댓글