Menu
Coddy logo textTech

상속 접근 수준

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

선택한 상속 유형은 파생 클래스에서 기본 클래스 멤버에 접근하는 방식에 영향을 미칩니다. C++은 public, protected, private 상속의 세 가지 옵션을 제공합니다.

각 유형이 멤버 접근 방식을 어떻게 변환하는지 보여줍니다:

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는 접근 불가
};

Public inheritance는 "is-a" 관계를 모델링하며 단연 가장 일반적으로 사용됩니다. DogAnimal이므로 외부 코드가 이를 하나로 다룰 수 있습니다.

Protected and private inheritance는 "implemented-in-terms-of" 관계를 모델링합니다. 이들은 외부 코드로부터 base class인터페이스를 숨겨서, inheritance 관계를 노출하지 않고 구현을 재사용하고 싶을 때 유용합니다. private inheritance를 사용하면, 더 하위의 derived 클래스조차 원래 base 멤버에 대한 access 권한을 잃게 됩니다.

challenge icon

챌린지

쉬움

간단한 디바이스 계층 구조를 구축하면서 다양한 상속 유형이 멤버 접근성에 어떠한 영향을 미치는지 살펴봅시다. 기본 Device 클래스와 각각 다른 상속 유형을 사용하는 세 개의 파생 클래스를 생성하여, public, protected 및 private 상속이 멤버 접근을 어떻게 변화시키는지 직접 확인하게 됩니다.

코드는 두 개의 파일로 구성합니다:

  • Device.h: 서로 다른 접근 수준을 가진 세 개의 멤버를 포함하는 기본 Device 클래스를 정의합니다:
    • public std::string model
    • protected int serialNumber
    • private int internalCode (기본값 999로 설정)
    • Model: <model>을 출력하는 public 메서드 showModel()

    그런 다음 서로 다른 상속 유형을 사용하여 Device로부터 각각 상속받는 세 개의 파생 클래스를 만듭니다:

    • public 상속을 사용하는 PublicDeviceSerial: <serialNumber>를 출력하는 displaySerial() 메서드 추가
    • protected 상속을 사용하는 ProtectedDeviceSerial: <serialNumber>를 출력하는 displaySerial() 메서드 추가
    • private 상속을 사용하는 PrivateDeviceSerial: <serialNumber>를 출력하는 displaySerial() 메서드 추가

    각 파생 클래스는 모델 이름과 시리얼 번호를 받는 생성자를 가져야 하며, 모델은 기본 클래스로 전달하고 시리얼 번호는 직접 설정합니다.

  • main.cpp: 두 개의 입력값(각각 별도의 줄)을 읽습니다:
    1. 모델 이름 (문자열)
    2. 시리얼 번호 (정수)

    동일한 입력값을 사용하여 각 파생 유형의 객체를 하나씩 생성합니다. 그런 다음 접근 차이점을 시연합니다:

    PublicDevice의 경우:

    • 객체에서 직접 showModel()을 호출합니다 (public 상속으로 인해 public 상태가 유지되므로 작동함)
    • model에 직접 접근하여 Direct model access: <model>을 출력합니다
    • displaySerial()을 호출합니다

    ProtectedDevicePrivateDevice의 경우:

    • displaySerial()만 호출합니다 (상속된 showModel()model은 더 이상 외부에서 public하게 접근할 수 없음)

    출력 형식:

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

예를 들어 입력값이 Laptop12345인 경우:

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

PublicDevice만이 상속된 public 멤버에 대한 외부 접근을 허용하는 방식을 확인해 보세요. 다른 상속 유형은 외부 코드로부터 기본 클래스 인터페이스를 숨기지만, 파생 클래스는 자체 메서드를 통해 내부적으로 protected 멤버에 여전히 접근할 수 있습니다.

직접 해보기

#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실력 점검

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

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