friend

외부에서 클래스의 private 멤버에 접근 가능하도록 허용하는 키워드

 

friend class 예시

class Item {

protected:
    FOnChanngedItemCount OnChangedItemCountDelegate;
    FOnChanngedItemInfo OnChangedItemInfoDelegate;
  
    friend class ItemContainer; // ItemDataContainer클래스는 Item클래스의 protected / private 멤버 직접 접근 가능
};


class ItemContainer() {

public:
    void ClearDelegate() {
    	// 원래는 접근 불가능한 변수
    	Item.OnChangedItemCountDelegate.Clear()
        Item.OnChagnedItemInfoDelegate.Clear()
    }
}

원래는 접근 불가능한 변수들이지만 friend 키워드로 ItemContainer 클래스에서 Item 클래스를 확인할 때 protected / private 변수들 까지 확인할 수 있는 것 이다.

 

 

friend function 예시

c++ 입출력 연산자 (<< , >>) 오버로딩은 멤버 함수로 구현할 수 없고 전역 함수로 구현할 수 있다.

std::cout 타입의 객체가 호출하므로  (오버라이딩 개념이 아님)

class A
{
private:
    int id;

public:
    A(int parm)
    {
        this->SetID(parm);
    }

    void SetID(int parm)
    {
        this->id = parm;
    }

    A operator + (A& a)
    {
        this->id += a.id;
        return A(id);
    }

    friend ostream &operator<<(ostream &, const A &);
};

ostream &operator<<(ostream &os, const A &a)
{
    os << "id: " << a.id;
    return os;
}



// 혹은

class A
{
...(생략)

    // A 클래스 안에 구현되어있어 멤버함수라 생각할 수 있지만 전역 함수임
    // 전역함수인데 A 클래스릐 friend 로 지정될 때 함수의 바디를 정의해 준 것 이다.
    friend ostream &operator<<(ostream &os, const A &a)
    {
        os << "id: " << a.id;
        return os;
    }
}

 

Friend선언은 논란이 많았다고한다. 객체지향의 대명사 중 하나인 정보은닉을 무너뜨리는 문법이기 때문에 friend 선언은 지나치면 아주 위험할 수 있다고한다.

 

 

inline

함수 호출이 함수 자체의 내용 복사본으로 대체되어 함수 오버헤드가 제거된다.

inline int Compare(int x, int y)
{
    return x > y ? y : x;
}

int main()
{
    cout << Compare(3, 1) << \n;
    cout << Compare(6, 2) << \n;
    return 0;
}


// main 을 컴파일하면 Inline 함수 부분이 치환되어 해당 함수로 들어가게 된다.
// obj 파일이 생성되는 과정에서 아래와 같은 형태로 변환된다.

int main()
{
    cout << (3 > 1 ? 3 : 1) << \n;
    cout << (6 > 2 ? 6 : 2) << \n;
    return 0;
}

 

함수를 호출하기위해서 호출된 시점을 주소 값 스택에 저장하고 매개변수 저장하고 리턴값을 저장소에 또 저장하고 다시 돌아오기 위해 호출 시점의 주소값을 꺼내고.. 과정의 오버헤드를 줄일 수 있는 것이다. 

 

하지만 무분별하게 inline 함수를 사용하면 실행코드가 늘어나고 컴파일 시간이 늘어나고 실행파일의 크기가 커지기 때문에 간결한 함수에만 적절히 사용해야하는 주의점이 있다.

 

최근에는 이를 방지하기 위해 컴파일러는 inline함수들을 직접 선언하여 컴파일 하기도 하며 inline함수로 선언된 부분을 일반 함수로 처리하기도 한다고 하기 때문에 크게 신경 쓸 필요는 없다.

+ Recent posts