C++

[C++] 숨겨진 친구(hidden friend)

코딩 메모장 2024. 11. 13. 20:17
728x90

"Hidden friend" 함수는 C++에서 친구(friend) 함수가 이름의 가시성 문제로 인해 호출되지 않는 현상을 설명하는 개념입니다. 이는 C++의 이름 가시성(scope) 규칙에서 비롯된 문제이며, 특정 규칙이나 표준이 아닌, 프로그래밍 중에 발생할 수 있는 문제 유형 중 하나입니다.

Hidden Friend의 개념

  1. 친구 함수:
    • 클래스 내부에서 friend 키워드를 사용해 선언된 함수로, 해당 클래스의 private 및 protected 멤버에 접근할 수 있습니다.
  2. 이름 가시성의 문제:
    • 친구 함수와 동일한 이름을 가진 다른 함수가 다른 범위(예: 다른 클래스나 네임스페이스 등)에서 정의되면, 호출 시 이 함수가 우선시 될 수 있습니다. 이로 인해 원래 의도했던 친구 함수가 호출되지 않거나 접근할 수 없는 "숨겨진" 상태가 될 수 있습니다.

예시

다음은 hidden friend 문제를 보여주는 예입니다.

#include <iostream>

class A {
public:
    void display() const {
        std::cout << "A::display()" << std::endl;
    }

    friend void show(A& a); // 친구 함수 선언
};

// 친구 함수 정의
void show(A& a) {
    std::cout << "Friend function called." << std::endl;
    a.display();
}

// 동일한 이름을 가진 다른 함수가 있는 경우
void show(int) {
    std::cout << "Non-friend function called." << std::endl;
}

int main() {
    A a;
    show(a);    // 여기서는 friend 함수가 호출됨
    show(42);   // 여기서는 non-friend 함수 호출
    return 0;
}

위 예제에서 show(A&)는 클래스 A의 친구 함수이며, show(int)는 전역 함수입니다. 두 함수의 이름이 같아도 서로 다른 매개변수를 가지므로 오버로딩된 형태로 구분됩니다. 하지만 다른 범위에서 같은 이름을 가지는 함수가 많아질수록 함수 호출이 애매해질 수 있습니다.

문제점

  • 함수 가려짐:
    • 다른 범위에서 동일한 이름을 가진 함수가 선언되면, 호출할 때 의도한 친구 함수가 아니라 다른 함수가 선택될 가능성이 있습니다. 특히 이름이 겹치는 경우 외부에서 친구 함수를 호출하기 어려워질 수 있습니다.

결론

Hidden friend 문제는 C++의 이름 가시성 규칙에 의해 친구 함수가 동일한 이름의 다른 함수에 의해 가려지는 상황을 설명합니다. 이를 방지하려면 함수 이름을 신중하게 선택하거나 네임스페이스를 활용하는 것이 좋습니다. Hidden friend 문제는 코드의 모호함을 줄이기 위한 네이밍과 구조 설계의 중요성을 잘 보여주는 사례입니다.

728x90