C++ 프로그래밍/기초 문법

[C++ 기초 문법] friend

SW Developer 2024. 2. 14. 23:00

friend

friend 는 마치 친구처럼 수평적인 관계로 클래스간의 멤버 변수를 공유하기 위해 사용된다. 그렇기 때문에 friend를 활용하면, 자신뿐만 아니라 다른 타입의 클래스에도 접근하는 것이 가능해져 코드의 확장이 용이해진다. 다만, 클래스 내부에서만 써야할 멤버들이 다른 곳에서 계속 활용된다면, 데이터 보호가 어려울 뿐만 아니라 캡슐화를 지향하는 객체지향적인 설계가 어려우므로 꼭 필요한 곳에서만 활용하는 것이 좋다.

 

 

[time.h]

#include <iostream>
#ifndef TIMEH
#define TIMEH

class Time
{
    private:
        int hours;
        int mins;
    public:
        Time();
        Time(int, int);
        void addHours(int);
        void addMins(int);
        Time operator+(Time&);
        void show();
        ~Time();
};

#endif

 

 

friend를 사용하기에 앞서, 먼저 Time 클래스와 int형 변수간의 곱셈을 지원하는 코드를 작성해보자

 

[time.h]에 Time 클래스와 int형 변수와의 곱셈 연산을 지원하는 operator* 오버로딩

Time operator*(int);//함수의 원형 제공

 

[func.cpp]에 Time 클래스와 int형 변수의 operator* 오버로딩에 대한 정의

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 코드 작성

int main(){
    Time t1(1, 20);
    Time t2;

    t2 = t1 * 3;//Time X int 연산
    t2 = t1.operator*(3);// Time X int 연산
}

 

위 코드처럼 단순히 Time클래스와 int형 변수간의 곱셈연산만을 지원하기 위한 거라면, friend가 구지 필요하지는 않다. 그런데 만약 아래처럼 Time 클래스와 int형 변수의 위치를 서로 교환하여 곱셈하려는 경우엔 어떨까?

t2 = 3 * t1;

 

→ Time::operator*(int n) 형식으로 원형을 정의했기 때문에, 이 경우 곱셈의 교환법칙은 성립하지 않는다

 

 

그렇다면 이제, friend를 사용해서 Time, int 간의 곱셈연산의 교환법칙이 성립하도록 코드를 작성해보자

 

[time.h]에 friend를 활용하여, operator* 연산 시 Time 클래스에 int형 변수가 접근 가능하도록 코드 추가

(만약 Time클래스와 int형 변수의 순서를 바꿔 곱셈연산할 경우, 기존에 정의한 operator*의 원형대로 결과값을 출력하도록 return)

Time operator*(int);//기존원형: Time클래스 X int형

//아래코드 추가
friend Time operator*(int n, Time& t) {//int형 X Time클래스 (순서 주의!)
    return t * n;//Time클래스 X int형 형식으로 return값 출력하도록 변경
}

 

main 코드 작성

int main(){
    Time t1(1, 20);
    Time t2;

    t2 = t1 * 3;//Time X int  연산
    t2 = 3 * t1;//int  X Time 연산
}

 

→ 이제 Time 클래스와 int형 변수간의 곱셈의 교환법칙 또한 성립한다

 

 

 

 

※ 해당 게시글은 개인 학습의 목적으로, 아래 강의를 수강한 후 정리한 학습노트입니다.

https://inf.run/pypW