본문 바로가기
C++/C++ 문법

C++ 부모 클래스 접근 지정자, 프랜드(friend)

by Sein_ 2025. 10. 14.
728x90

[Do it C++ 완전정복_ 289~298 p]

부모클래스 접근 지정자

상속 시, 부모 클래스의 멤버 접근 수준이 자식 클래스에서 어떻게 바뀌는지를 결정하는 지정자

class 자식클래스 : [public / protected / private] 부모클래스

 

상속 접근 지정자에 따른 멤버 접근 변화

상속 방식 부모의 public 멤버 부모의 protected 멤버 부모의 private 멤버 외부 접근 가능 여부
public 상속 자식에서도 public 자식에서도 protected 접근 불가 부모의 public 멤버 접근 가능
protected 상속 자식에서 protected 자식에서 protected 접근 불가 외부 접근 불가
private 상속 자식에서 private 자식에서 private 접근 불가 외부 접근 불가

 

여기서 질문!

상속 접근 지정자를 private 설정시, 부모 접근 지정자가 자식 클래스에서 private 으로 적용된다고 하였다.

private 상속이면 자식도 못 쓰는 거 아닌가?

private 상속이더라도 자식 클래스 내부에서는 부모의 public / protected 멤버 접근 가능하다.
단, 외부에서는 부모 멤버에 접근할 수 없게 된다.

 

상속 접근 지정자 private 설정 예시

#include <iostream>
using namespace std;

class Parent {
public:
    int a = 1;
protected:
    int b = 2;
private:
    int c = 3;
};

class Child : private Parent {
public:
    void show() {
        cout << a << " " << b << endl; // 가능 (부모 public/protected 접근 가능)
        // cout << c;  // private은 접근 불가
    }
};

int main() {
    Child obj;
    // cout << obj.a; // 불가능: private 상속으로 외부 접근 차단
    obj.show();
}

 

 

프렌드(friend) 함수와 클래스

프렌드 함수

클래스 외부의 함수가 클래스 내부의 private/protected 멤버에 접근할 수 있도록 허용하는 함수.

선언 시 friend 키워드를 사용한다.

friend로 선언된 함수는 클래스의 멤버 함수가 아님에도 private 멤버에 접근 가능

class Box {
    private: int w;
    public: Box(int x):w(x){} friend void show(Box b);
};

void show(Box b){ cout << b.w; } // 접근 가능

 

프렌드 클래스

특정 클래스 전체를 다른 클래스의 friend로 지정하면, 그 클래스의 모든 private/protected 멤버에 접근할 수 있다.

class Car {
    private: int speed=100;
    friend class Mechanic;
};

class Mechanic {
	public: void tune(Car c){ cout << c.speed; }
};