Menu
Coddy logo textTech

상속 접근 수준

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 49번째.

선택하는 inheritance 유형은 derived class에서 Base class 멤버에 접근하는 방식에 영향을 줍니다. C++는 세 가지 옵션을 제공합니다: public, protected, private inheritance.

각 유형이 member access를 어떻게 변환하는지 살펴보겠습니다:

Base Memberpublic inheritanceprotected inheritanceprivate inheritance
publicpublicprotectedprivate
protectedprotectedprotectedprivate
privateinaccessibleinaccessibleinaccessible
class Base {
public:
    int pub;
protected:
    int prot;
private:
    int priv;
};

class PublicDerived : public Base {
    // pub는 public, prot는 protected, priv는 접근 불가
};

class ProtectedDerived : protected Base {
    // pub는 protected, prot는 protected, priv는 접근 불가
};

class PrivateDerived : private Base {
    // pub는 private, prot는 private, priv는 접근 불가
};

공개 상속은 "is-a" 관계를 모델링하며, 가장 일반적으로 사용되는 상속 방식입니다. DogAnimal이므로 외부 코드는 이를 하나의 동물로 다룰 수 있습니다.

Protected and private inheritance model은 "implemented-in-terms-of" 관계를 구현합니다. 이는 base class 인터페이스를 외부 코드로부터 숨기며, inheritance 관계를 노출하지 않고 구현을 재사용하려는 경우에 유용합니다. private inheritance를 사용하면 더 파생된 derived class도 원래 base 멤버에 대한 access를 잃습니다.

challenge icon

챌린지

쉬움

서로 다른 inheritance 유형이 member 접근성에 어떤 영향을 미치는지 간단한 device 계층 구조를 만들어 살펴보겠습니다. 기본 Device class와 서로 다른 inheritance 유형을 사용하는 세 개의 derived class를 만들고, public, protected, private inheritance가 member access를 어떻게 변환하는지 직접 확인합니다.

코드는 두 파일에 나누어 작성합니다:

  • Device.h: 서로 다른 access level을 가진 세 개의 member를 포함하는 기본 Device class를 define합니다:
    • public std::string model
    • protected int serialNumber
    • private int internalCode (기본값 999로 설정)
    • Model: <model>을 출력하는 public method showModel()

    그런 다음 서로 다른 inheritance 유형을 사용하여 Device에서 각각 inherit하는 세 개의 derived class를 만듭니다:

    • PublicDevicepublic inheritance를 사용합니다: Serial: <serialNumber>를 출력하는 method displaySerial()을 추가합니다.
    • ProtectedDeviceprotected inheritance를 사용합니다: Serial: <serialNumber>를 출력하는 method displaySerial()을 추가합니다.
    • PrivateDeviceprivate inheritance를 사용합니다: Serial: <serialNumber>를 출력하는 method displaySerial()을 추가합니다.

    각 derived class에는 model name과 serial number를 인수로 받고, model을 기본 class에 전달하며 serial number를 설정하는 Constructor가 있어야 합니다.

  • main.cpp: 두 개의 input을 읽습니다(각각 별도의 줄에 입력):
    1. Model name (string)
    2. Serial number (integer)

    동일한 input 값을 사용하여 각 derived type의 object를 하나씩 Create합니다. 그런 다음 access 차이를 Demonstrate합니다:

    PublicDevice의 경우:

    • object에서 직접 showModel()을 Call합니다(public inheritance는 이를 public으로 유지하므로 작동합니다).
    • model에 직접 access하고 Direct model access: <model>을 print합니다.
    • displaySerial()을 Call합니다.

    ProtectedDevicePrivateDevice의 경우:

    • displaySerial()만 Call합니다(상속된 showModel()model은 더 이상 외부에서 publicly accessible하지 않습니다).

    Output format:

    --- PublicDevice ---
    Model: <model>
    Direct model access: <model>
    Serial: <serial>
    --- ProtectedDevice ---
    Serial: <serial>
    --- PrivateDevice ---
    Serial: <serial>

예를 들어 input이 Laptop12345인 경우:

--- PublicDevice ---
Model: Laptop
Direct model access: Laptop
Serial: 12345
--- ProtectedDevice ---
Serial: 12345
--- PrivateDevice ---
Serial: 12345

PublicDevice만 상속된 public member에 대한 external access를 허용한다는 점에 주목하세요. 다른 inheritance 유형은 base class interface를 외부 code에서 숨기지만, derived class는 여전히 자체 method를 통해 protected member에 내부적으로 access할 수 있습니다.

직접 해보기

#include <iostream>
#include <string>
#include "Device.h"

using namespace std;

int main() {
    // 입력 읽기
    string modelName;
    int serialNum;
    
    getline(cin, modelName);
    cin >> serialNum;
    
    // TODO: 입력 값으로 각 파생 타입의 객체를 생성하세요
    // PublicDevice pubDev(modelName, serialNum);
    // ProtectedDevice protDev(modelName, serialNum);
    // PrivateDevice privDev(modelName, serialNum);
    
    // TODO: Demonstrate PublicDevice access
    cout << "--- PublicDevice ---" << endl;
    // - 객체에서 직접 showModel()을 호출하세요
    // - Access model directly and print: Direct model access: <model>
    // - displaySerial()을 호출하세요
    
    // TODO: Demonstrate ProtectedDevice access
    cout << "--- ProtectedDevice ---" << endl;
    // - displaySerial()만 호출하세요 (showModel과 model은 공개적으로 접근할 수 없음)
    
    // TODO: Demonstrate PrivateDevice access
    cout << "--- PrivateDevice ---" << endl;
    // - displaySerial()만 호출하세요 (showModel과 model은 공개적으로 접근할 수 없음)
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C++ 컴파일러