[디딤돌 C++] 29. 접근 지정자 protected

이번에는 접근 지정자 protected에 관해 알아보기로 해요.

캡슐화에서 접근 지정자를 사용하여 멤버의 가시성을 설정할 수 있다는 것을 다뤘었죠. private으로 접근 지정한 것은 형식 내부에서 사용할 수 있고 public으로 지정하면 모든 곳에서 접근할 수 있다는 것은 이미 소개하였습니다.

파생 클래스를 정의하면 기반 형식의 멤버를 상속받는다고 하였는데 접근 지정을 private으로 설정한 멤버는 어떻게 접근할까요?

priavate으로 접근 지정한 멤버는 파생 클래스에서도 접근할 수 없습니다. 분명히 상속받아 개체 내부에 있지만 가시성이 없어 접근할 수 없습니다. 이럴 때는 기반 클래스에서 protected로 접근 지정하여 파생 클래스에서 접근할 수 있게 해 주어야 합니다. 즉 protected 접근 지정은 형식 내부와 파생 형식에서도 접근할 수 있게 가시성을 지정하는 것입니다.

예를 들어 음악가의 이름을 private으로 접근 지정하였을 때 protected로 GetName 접근자 메서드를 제공하면 파생 클래스에서 이름은 접근할 수 없지만 GetName으로 이름을 확인할 수 있습니다. 물론 형식 외부에서는 이름과 GetName 모두 접근할 수 없지요.

protected: //형식 내부와 파생 클래스 내부에서 접근 가능
    string GetName()const//이름 접근자
    {
        return name;
    }

이번에는 접근 지정자 protected에 관해 알아보기로 해요.

캡슐화에서 접근 지정자를 사용하여 멤버의 가시성을 설정할 수 있다는 것을 다뤘었죠. private으로 접근 지정한 것은 형식 내부에서 사용할 수 있고 public으로 지정하면 모든 곳에서 접근할 수 있다는 것은 이미 소개하였습니다.

파생 클래스를 정의하면 기반 형식의 멤버를 상속받는다고 하였는데 접근 지정을 private으로 설정한 멤버는 어떻게 접근할까요?

priavate으로 접근 지정한 멤버는 파생 클래스에서도 접근할 수 없습니다. 분명히 상속받아 개체 내부에 있지만 가시성이 없어 접근할 수 없습니다. 이럴 때는 기반 클래스에서 protected로 접근 지정하여 파생 클래스에서 접근할 수 있게 해 주어야 합니다. 즉 protected 접근 지정은 형식 내부와 파생 형식에서도 접근할 수 있게 가시성을 지정하는 것입니다.

예를 들어 음악가의 이름을 private으로 접근 지정하였을 때 protected로 GetName 접근자 메서드를 제공하면 파생 클래스에서 이름은 접근할 수 없지만 GetName으로 이름을 확인할 수 있습니다. 물론 형식 외부에서는 이름과 GetName 모두 접근할 수 없지요.

다음은 음악가 클래스에 GetName 접근자 메서드를 protected로 접근 지정하여 파생 클래스인 피아니스트의 Tuning 메서드에서 사용하는 예제 코드입니다.

//접근 지정자 protected
#include <iostream>
#include <string>
using namespace std;

class Musician
{    
    string name;
public:
    Musician(string name)
    {
        this->name = name;
        cout<<"음악가 생성자"<<endl;
    }
    ~Musician()
    {
        cout<<"음악가 소멸자"<<endl;
    }
    void Play()
    {
        cout<<"딩동댕"<<endl;
    }
    void View()
    {
        cout<<"이름:"<<name<<endl;
    }
protected: //형식 내부와 파생 클래스 내부에서 접근 가능
    string GetName()const//이름 접근저
    {
        return name;
    }
};


class Pianist: 
    public Musician //Musician 클래스를 기반으로 파생한 Pianist 클래스 정의
{
public:
    Pianist(string name):Musician(name) //기반 클래스 생성자 초기화
    {
        cout<<"피아니스트 생성자"<<endl;
    }
    ~Pianist()
    {
        cout<<"피아니스트 소멸자"<<endl;
    }
    void Tuning()
    {
        //기반 클래스에 protected로 접근 지정한 GetName을 호출
        cout<<GetName()<<" 조율하다."<<endl;
    }
};

int main()
{
    Pianist *pianist = new Pianist("홍길동");
    pianist->View();
    pianist->Tuning();
    pianist->Play();
    delete pianist;
    return 0;
}

▷ 실행 결과

음악가 생성자

피아니스트 생성자

이름:홍길동

홍길동 조율하다.

딩동댕

피아니스트 소멸자

음악가 소멸자