C++ std::friend

1 분 소요

std::friend

C++는 클래스 안에서 다른 클래스나 다른 클래스의 멤버 함수 또는 비멤버 함수를 friend로 선언하는 기능을 제공한다. friend로 지정한 대상은 이 클래스의 protected나 priate 데이터 멤버와 메서드에 접근할 수 있다. 예를 들어 Foo와 Bar라는 두 클래스가 있다고 하자.
class Foo
{
    friend class Bar;
    // ...
}
위는 Bar클래스를 Foo의 프렌드로 지정한 코드다. 그러면 Bar에 있는 모든 메서드는 Foo의 private나 protected 데이터 멤버 및 메서드에 접근 할 수 있다. 또는 특정 메서드만 프렌드로 만들수도 있는데 이때는 다음과 같이 작성하면 된다.
class Foo
{
    friend void Bar::processFoo(const Foo& foo);
}

스탠드얼론 (standalone: 멤버가 아닌 독립) 함수도 클래스의 프렌드가 될수 있다. 다음과 같이 함수를 프렌드로 만들면 된다.
class Foo
{
    friend void dumpFoo(const Foo& foo);
}
위에서 friend 선언문은 함수 프로토타입의 역할을 한다. 이렇게 지정한 프로토타입은 다른 곳에 따로 선언하지 않아도 된다. 함수의 정의를 하는 방법은 다른 함수와 같다.
void dumpFoo(const Foo& foo)
{
    // private 및 protected 데이터 멤버를 비롯한 foo의 데이터를 모두 콘솔에 출력한다.
}
위에서 보는것처럼 함수를 정의할 때는 friend 키워드를 생략해도 된다.
  • 프렌드로 지정할 클래스, 메서드, 함수는 반드시 접근할 클래스 안에서 지정해야 한다. 이들을 다른 곳에서 대상 클래스의 프렌드라고 선언해서 그 클래스의 private나 protected 멤버에 접근하게 할 수는 없다.
  • 클래스나 메서드를 프렌드로 지정하는 기능을 너무 많이 사용하면 클래스의 내부가 외부 클래스나 함수에 드러나서 캡슐화 원칙 이 깨진다. 따라서 꼭 필요할 때만 사용한다.

참고

  • 전문가를 위한 C++

태그:

카테고리:

업데이트: