[c++]friend

이승희·2023년 11월 10일

c++

목록 보기
5/6
post-thumbnail

friend 키워드란?

  • friend 키워드는 C++에서 클래스의 private 또는 protected 멤버에 접근할 수 있는 권한을 부여하는 키워이다. 일반적으로 클래스 외부에서는 접근이 제한되는 private 또는 protected 멤버에 접근할 수 있도록 한다.
  • friend 키워드는 함수 또는 클래스 앞에 붙을 수 있다. 즉, 특정 함수를 friend로 선언하거나, 다른 클래스 전체를 friend로 선언할 수 있다.❗️

friend를 사용하는 이유

  • friend 키워드는 클래스의 캡슐화를 깨트리는 것처럼 보일 수 있지만, 실제로는 캡슐화를 유지하면서도 특정 함수나 클래스에 접근 권한을 부여함으로써 코드의 유연성을 높이는 데 사용
  • 예를 들어, 두 개의 다른 클래스가 서로의 private 멤버에 직접 접근해야 하는 경우, 또는 전역 함수가 특정 클래스의 private 멤버에 접근할 필요가 있는 경우에는 friend 키워드를 사용할 수 있다.🧐

연산자 중복을 외부 함수로 구현하기

  • 연산자 중복은 클래스의 멤버 함수로 구현할 수도 있지만, 외부 함수로도 구현할 수 있습니다. 외부 함수로 구현하는 경우에는 함수를 friend로 선언하여 클래스의 private 멤버에 접근하게 할 수 있다.

'+ 연산자 중복 (외부 함수)'

클래스 내부에 friend 선언

friend Power operator+ (Power op1, Power op2);

외부에서 정의

Power operator+ (Power op1, Power op2)
{
    Power tmp;
    tmp.kick = op1.kick + op2.kick;
    tmp.punch = op1.punch + op2.punch;
    return tmp;
}

main

c = a + b;
c.show();
  • 위의 코드에서 operator+ 함수는 Power 클래스의 멤버 함수가 아니라 외부 함수다. 그러나 friend로 선언되어 있기 때문에 Power 클래스의 private 멤버인 kickpunch에 접근할 수 있다.
  • 이 함수는 두 개의 Power 객체를 인자로 받아서, 각 멤버를 더한 새로운 객체를 반환
  • 이렇게 외부 함수로 연산자를 중복하는 방식은 두 객체 간의 연산을 표현할 때 자연스러운 경우가 많다. 예를 들어, a + b와 같은 표현은 a.operator+(b)보다 더 직관적일 수 있다.

'==' 연산자 중복 (외부 함수)

클래스 내부에 friend 선언

friend bool operator== (Power op1, Power op2);

외부에서 정의

bool operator== (Power op1, Power op2)
{
    return (op1.kick == op2.kick) && (op1.punch == op2.punch);
}

main

if (a == b)
{
    cout << "같음" << endl;
}
else
{
    cout << "다름" << endl;
}

'+= 연산자 중복 (외부 함수)'

클래스 내부에 friend 선언

friend Power& operator+= (Power& op1, Power op2);

외부에서 정의

Power& operator+= (Power& op1, Power op2)
{
    op1.kick += op2.kick;
    op1.punch += op2.punch;
    return op1;
}

main

a += b;
a.show();

'++(전위) 연산자 중복 (외부 함수)'

클래스 내부에 friend 선언

friend Power& operator++ (Power& op);

외부에서 정의

Power& operator++ (Power& op)
{
    ++op.kick;
    ++op.punch;
    return op;
}

main

++a;
a.show();

'++(후위) 연산자 중복 (외부 함수)'

클래스 내부에 friend 선언

friend Power operator++ (Power& op, int);

외부에서 정의

Power operator++ (Power& op, int)
{
    Power tmp = op;
    op.kick++;
    op.punch++;
    return tmp;
}

main

a++;
a.show();

'+ 연산자 중복 (객체+상수) (외부 함수)'

클래스 내부에 friend 선언

friend Power operator+ (Power op1, int op2);

외부에서 정의

Power operator+ (Power op1, int op2)
{
    Power tmp = op1;
    tmp.kick += op2;
    tmp.punch += op2;
    return tmp;
}

main

b = a + 2;
b.show();

위의 코드에서 friend 키워드로 선언된 모든 연산자 함수들은 클래스의 private 멤버에 접근할 수 있다. 이를 통해 두 객체 간의 연산을 자연스럽게 표현할 수 있지만, friend 키워드는 적절히 사용하는 것이 중요하다. 너무 많은 함수나 클래스에 접근 권한을 부여하면, 코드의 복잡성이 증가하고 에러를 유발할 수 있다. 따라서 friend 키워드는 필요한 경우에만 사용하고, 그 외의 경우에는 클래스의 public 인터페이스를 통해 접근하는 것이 좋다.

0개의 댓글