728x90
C++에서 비멤버 함수(non-member function)는 클래스의 멤버가 아닌 함수로, 객체와 독립적으로 정의됩니다. 이런 함수는 특정 클래스의 객체를 인자로 받아 작업을 수행할 수 있으며, 주로 다음과 같은 경우에 사용됩니다:
- 연산자 오버로딩: 비멤버 함수는 이진 연산자와 같은 경우에 사용될 수 있습니다. 예를 들어, 두 객체를 더하는 + 연산자를 비멤버 함수로 오버로드할 수 있습니다. 비멤버 함수로 정의할 경우, 두 개 이상의 클래스의 인스턴스를 인자로 받을 수 있기 때문에 클래스 간의 상호작용이 필요한 경우 유리합니다.
- 유틸리티 함수: 클래스의 상태에 의존하지 않고 공통적으로 사용할 수 있는 기능을 제공하는 함수를 정의할 때 비멤버 함수를 사용합니다. 예를 들어, 특정 클래스의 데이터와 관계없이 반복적으로 호출되는 기능은 비멤버 함수로 구현하면 좋습니다.
- 함수 접근: 비멤버 함수는 클래스의 private 멤버에는 접근할 수 없지만, public 인터페이스를 통해 클래스 객체와 상호작용할 수 있습니다. 이를 통해 클래스 외부에서 클래스의 기능을 확장할 수 있습니다. 다만, friend 키워드를 사용하면 비멤버 함수가 클래스의 private 멤버에도 접근할 수 있게 할 수 있습니다.
비멤버 함수 예제
#include <iostream>
class Point {
public:
int x, y;
Point(int x, int y) : x(x), y(y) {}
};
// 비멤버 함수
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 p2(3, 4);
Point p3 = p1 + p2; // 비멤버 함수 호출
std::cout << "Result: (" << p3.x << ", " << p3.y << ")\n";
return 0;
}
위 예제에서 operator+는 Point 클래스의 비멤버 함수로, 두 점의 합을 계산합니다. 비멤버 함수는 클래스와의 결합도를 낮추고, 코드의 가독성을 높이는 데 도움을 줍니다.
멤버 함수와의 비교
연산자 오버로딩은 비멤버 함수뿐만 아니라 멤버 함수로도 정의할 수 있습니다. 다음은 같은 연산자를 멤버 함수로 오버로드한 예제입니다
#include <iostream>
class Point {
public:
int x, y;
Point(int x, int y) : x(x), y(y) {}
// 멤버 함수로 정의된 연산자 오버로딩
Point operator+(const Point& other) const {
return Point(this->x + other.x, this->y + other.y);
}
};
int main() {
Point p1(1, 2);
Point p2(3, 4);
Point p3 = p1 + p2; // 멤버 함수 호출
std::cout << "Result: (" << p3.x << ", " << p3.y << ")\n";
return 0;
}
위 예제에서는 operator+가 Point 클래스의 멤버 함수로 정의되어 있습니다. 멤버 함수로 구현할 경우 해당 클래스의 인스턴스를 암시적으로 첫 번째 인자로 받습니다.
비멤버 함수의 장점
- 결합도 감소: 비멤버 함수는 클래스의 멤버가 아니므로 클래스와의 결합도가 낮습니다. 이는 클래스의 수정 없이 기능을 확장하거나, 두 개 이상의 클래스 객체를 동시에 다루는 연산자 오버로딩에서 유용합니다.
- 유연성: 여러 클래스를 대상으로 공통 작업을 수행할 때 비멤버 함수를 활용하여 코드를 보다 유연하게 작성할 수 있습니다.
친구 함수(friend function)
비멤버 함수가 클래스의 private 멤버에 접근할 필요가 있는 경우, 클래스에서 해당 함수를 friend로 선언할 수 있습니다. 이를 통해 비멤버 함수도 클래스의 private 멤버에 접근할 수 있게 됩니다.
class Point {
private:
int x, y;
public:
Point(int x, int y) : x(x), y(y) {}
// 친구 함수 선언
friend Point operator+(const Point& p1, const Point& p2);
};
Point operator+(const Point& p1, const Point& p2) {
return Point(p1.x + p2.x, p1.y + p2.y); // private 멤버에 접근 가능
}
위 코드에서는 operator+ 함수가 Point 클래스의 private 멤버에 접근할 수 있도록 friend로 선언되었습니다.
728x90
'C++' 카테고리의 다른 글
[C++] 템플릿 특수화(template specialization) (1) | 2024.10.23 |
---|---|
[C++] 유니버셜 문자 이름(UCN/universal-character-name) (1) | 2024.10.22 |
[C++] std::vector와 malloc함수 비교 (1) | 2024.10.17 |
[C++] 컨테이너(container) (1) | 2024.10.15 |
[C++] push_back 함수 (1) | 2024.10.14 |