friend 함수
C++에서 클래스의 private 및 protected 멤버에 접근할 수 있도록 특별히 허용된 함수이다. 이를 연산자 오버로딩에 활용할 수 있다.
왜 friend 함수가 필요할까?
일반적으로 연산자 오버로딩은 멤버 함수 또는 비멤버 함수로 구현된다.
멤버 함수로 오버로딩할 경우 연산자 왼쪽에 있는 객체가 반드시 해당 클래스의 객체여야 한다.
예)
// 왼쪽: 객체, 오른쪽: 객체
Point(3, 4) + Point(3, 5)
하지만 비멤버 함수로 오버로딩할 경우 클래스의 비공개 멤버에 접근하려면 friend 키워드를 사용해야 한다.
// 왼쪽: 클래스 객체가 아님, 오른쪽: 객체
3 + Point(3, 4)
3 + point(3, 4)
객체가 아닌 기본 자료형(예: int)도 Point 클래스의 friend 연산자 함수를 호출할 수 있다. 이는 friend 함수가 클래스의 멤버 함수가 아니라 비멤버 함수로 동작하기 때문이다.
객체와 기본 자료형의 조합
3 + Point(3, 4)처럼 기본 자료형과 클래스 객체를 함께 사용하는 경우, 컴파일러는 다음을 시도한다.
- + 연산에 맞는 함수가 있는지 찾는다.
- 클래스 내부의 멤버 연산자를 찾거나, 전역 범위에 선언된 비멤버 연산자 함수를 찾는다.
friend 함수의 역할
friend 함수는 클래스 내부에서 선언되었지만, 비멤버 함수로 동작한다.
즉, 클래스 외부에 선언된 함수이므로 클래스 객체가 아니어도 호출될 수 있다.
friend 함수는 클래스의 private 또는 protected 멤버에 접근할 수 있는 특별 권한을 가진다.
왜 기본 자료형도 호출이 가능할까? - 변환 생성자
Point 클래스에 변환 생성자가 있다면 3을 Point로 변환할 수 있다. 변환된 후, 연산은 비멤버 연산자 함수인 operator+를 호출한다.
class Point {
public:
int x, y;
// 변환 생성자
Point(int value) : x(value), y(0) {}
// friend 연산자 오버로딩
friend Point operator+(const Point& p1, const Point& p2) {
return Point(p1.x + p2.x, p1.y + p2.y);
}
};
int main() {
Point p1(1, 2);
Point result = 3 + p1; // 3이 Point(3, 0)으로 변환됨
return 0;
}
언제 쓰는 걸까?
- friend 함수가 꼭 필요한 것은 아니지만, 클래스 외부에서 정의해야 하거나 연산자의 대칭성(3 + Point, Point + 3 같은)을 보장하고 싶을 때 유용하다.
- 멤버 함수는 클래스 내부에서 정의되고, 왼쪽 피연산자가 반드시 객체여야 한다는 제약이 있다.
- 설계의 요구 사항에 따라 friend를 사용할지 멤버 함수로 처리할지 선택하면 된다.
'C++' 카테고리의 다른 글
fill vs fill_n vs memset (0) | 2025.01.20 |
---|---|
[C++ 기초 플러스] Chapter 08 프로그래밍 연습 풀이 (0) | 2025.01.09 |
[C++ 기초 플러스] Chapter 07 프로그래밍 연습 풀이 (1) | 2025.01.08 |
함수 원형은 왜 필요한가? (0) | 2025.01.08 |
잡다한 문법 지식들 (1) (0) | 2025.01.08 |