friend 키워드
목차
- 01. Intro
- 02. friend 키워드
- 정의 및 특징
- 주의점
- 03. 마무리
- 04. 연관 내용
01. Intro
오늘은 [friend 키워드]에 대해서 알아보겠습니다.
02. friend 키워드
정의 및 특징
정의
friend 키워드는 클래스의 private으로 선언된 멤버 변수에 접근할 수 있도록 허용하는 키워드입니다.
다른 클래스에서 현재 클래스의 private 멤버 변수에 바로 접근할 때, 사용합니다.
friend class 클래스명;
friend 키워드를 사용할 때, 위 형태처럼 [friend 키워드 + class 키워드 + 클래스명]을 조합해서 사용합니다.
예시
#include <iostream>
using namespace std;
class A
{
public:
A() : _num(0) {}
A(int num) : _num(num) {}
friend class B;
private:
int _num;
};
class B
{
public:
void printA(A& a)
{
cout << a._num << endl;
}
private:
};
class C
{
public:
void printA(A& a)
{
// cout << a._num << endl;
}
private:
};
int main()
{
A a(100);
B b;
b.printA(a);
return 0;
}

위 코드를 실행하면, B클래스의 객체에서 A클래스의 private 멤버 변수인 _num에 접근하는 것을 확인할 수 있습니다.
A 클래스와 B 클래스는 전혀 다른 클래스임에도, A 클래스 내부에서 [friend class B;]로 인해 B클래스에서 A 클래스의 private 멤버 변수에 접근할 수 있습니다.

C클래스는 friend 키워드가 사용되지 않았으므로, C클래스 내부에서 A클래스의 멤버 변수에 접근할 수 없습니다.
friend 키워드 선언 위치
class A
{
public:
A() : _num(0) {}
A(int num) : _num(num) {}
private:
int _num;
friend class B;
};
class B
{
public:
void printA(A& a)
{
cout << a._num << endl;
}
private:
};
friend 키워드는 레이아웃에 상관없이 어떤 영역에서 선언해도 동일하게 작동합니다.
즉, public 레이아웃, protected 레이아웃, private 레이아웃 어느 곳에서든 friend class B가 동일하게 작동합니다.
상속받지 않는 세 클래스에서 관계
#include <iostream>
using namespace std;
class A
{
public:
A() : _num(0) {}
A(int num) : _num(num) {}
private:
int _num;
friend class B;
};
class B
{
public:
B() : _value(0) {}
B(int value) : _value(value) {}
void printA(A& a)
{
cout << a._num << endl;
}
private:
int _value;
friend class C;
};
class C
{
public:
void printA(A& a)
{
// cout << a._num << endl;
}
void printB(B& b)
{
cout << b._value << endl;
}
private:
};
int main()
{
A a(100);
B b(500);
C c;
b.printA(a);
c.printB(b);
return 0;
}

friend 키워드를 통해서 다양한 실험을 진행해 봤습니다.
1. A클래스 내부에서 B클래스에 friend 키워드를 사용해, A클래스의 private 멤버 변수에 접근이 가능하도록 설정했습니다.
2. B클래스 내부에서 C클래스에 friend 키워드를 사용해, B클래스의 private 멤버 변수에 접근이 가능하도록 설정했습니다.
A클래스는 B클래스에서 접근 허용하고, B클래스는 C클래스에서 접근 허용하도록 했을 때, A클래스는 C클래스에서 접근이 가능한지 테스트했습니다.
그 결과, C클래스에서는 A클래스의 private 멤버 변수에 대해 접근할 수 없었습니다.
이는 삼단 논법처럼 [A는 B이고, B는 C이면, A는 C이다]와 달리 독립적으로 작동하기 때문입니다.
즉, A클래스 내부에서의 friend class B와 B클래스 내부에서의 friend class C는 독립적으로 작동해, A클래스 내부에서의 friend class C처럼 작동하지 않습니다.
사실 조금만 생각해 봐도 당연한 거라고 생각이 들지만, 직접 테스트해보고 싶어서 추가했습니다.
상속 관계가 있는 클래스에서 friend 키워드 결과
class A
{
public:
A() : _num(0) {}
A(int num) : _num(num) {}
private:
int _num;
friend class B;
};
class B
{
public:
B() : _value(0) {}
B(int value) : _value(value) {}
void printA(A& a)
{
cout << a._num << endl;
}
private:
int _value;
friend class C;
};
class C : public B
{
public:
void printA(A& a)
{
// cout << a._num << endl;
}
void printB(B& b)
{
cout << b._value << endl;
}
private:
};
상속 관계가 있는 클래스에 대해서는 friend 키워드가 어떻게 작동하지는 실험했습니다.
1. B클래스를 상속받는 C클래스가 있다고 가정합니다.
2. A클래스 내부에서는 friend class B, B클래스 내부에서는 friend class C만 선언했습니다.
위 코드로 실험하니, 이전처럼 C클래스는 A클래스의 private 멤버 변수에 대해 접근할 수 없었습니다.
이를 통해 아무리 상속 관계인 자식 클래스이더라도, 오로지 friend 키워드를 받은 해당 클래스에서만 접근할 수 있음을 알 수 있었습니다.
주의점
friend 키워드는 해당 클래스의 private 멤버 변수에 직접적으로 접근해 읽고 쓸 수 있으므로 캡슐화를 깨뜨릴 수 있습니다.
그래서, 무분별한 friend 키워드 사용은 지양해야 합니다.
그러므로, 두 클래스가 밀접하게 연관되어 있는 경우에만 사용하는 것을 권장합니다.
03. 마무리
오늘은 다른 연산자 오버로딩을 하기 전에, friend 키워드에 대해 먼저 알아보았습니다.
04. 연관 내용
읽어주셔서 감사합니다.
틀린 내용 지적은 언제나 환영입니다!
'게임 개발 > C++' 카테고리의 다른 글
| [C++] 연산자 오버로딩 - 2. 사칙 연산자 (0) | 2025.03.31 |
|---|---|
| [C++] 연산자 오버로딩 - 1. 전위형 / 후위형 증감 연산자 (0) | 2025.03.30 |
| [C++] 람다 함수 - 2. 활용 (0) | 2025.03.26 |
| [C++] 람다 함수 - 1. 기본 형태 (0) | 2025.03.25 |
| [C++] 동적 할당 - new/delete (0) | 2025.03.21 |