C++

[C++] 비멤버 함수(non-member function)

코딩 메모장 2024. 10. 21. 23:18
728x90

C++에서 비멤버 함수(non-member function)는 클래스의 멤버가 아닌 함수로, 객체와 독립적으로 정의됩니다. 이런 함수는 특정 클래스의 객체를 인자로 받아 작업을 수행할 수 있으며, 주로 다음과 같은 경우에 사용됩니다:

  1. 연산자 오버로딩: 비멤버 함수는 이진 연산자와 같은 경우에 사용될 수 있습니다. 예를 들어, 두 객체를 더하는 + 연산자를 비멤버 함수로 오버로드할 수 있습니다. 비멤버 함수로 정의할 경우, 두 개 이상의 클래스의 인스턴스를 인자로 받을 수 있기 때문에 클래스 간의 상호작용이 필요한 경우 유리합니다.
  2. 유틸리티 함수: 클래스의 상태에 의존하지 않고 공통적으로 사용할 수 있는 기능을 제공하는 함수를 정의할 때 비멤버 함수를 사용합니다. 예를 들어, 특정 클래스의 데이터와 관계없이 반복적으로 호출되는 기능은 비멤버 함수로 구현하면 좋습니다.
  3. 함수 접근: 비멤버 함수는 클래스의 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