본문 바로가기
프로그래밍 언어/C++

[C++] protected 생성자(Constructor)란?

by 까망 하르방 2021. 7. 4.
반응형

객체지향프로그래밍에서...

아래와 같이 Animal 이라는 모든 동물의 특성을 지닌 객체가 있고,

고유 특성을 지닌 개, 고양이, 닭, 말 등들이 Animal 클래스를 상속하는 경우가 있다.

class Animal
{
public:
       Animal() {}
};

class Harbang : public Animal
{
public:
       Harbang() {} // => Harbang() : Animal() {}
};

int main()
{
       Animal animal;
       Harbang harbang;
}

 

Animal 클래스에서 기본 생성자가 public이기 때문에

아래와 같이 Animal animal;를 제한없이 선언할 수 있다.

 

하지만 Animal 객체의 목적은 공통의 특성을 저장하는 것이지

하나의 인스턴스로 사용하고자 하는 것이 아니다.

이를 위해 private 영역으로 기본 생성자를 두면

class Animal
{
private:
    Animal() {}
};

class Harbang : public Animal
{
public:
    Harbang() {} // => Harbang() : Animal() {} // error 발생
};

int main()
{
    Animal animal; // error 발생
    Harbang harbang;
}

Animal animal;를 사용하지 못하도록 제한하였지만 

  (protected 멤버를 외부에서 호출 불가)

- 파생 클래스(Harbang)에서 기반 클래스의 Animal에 접근하지 못하게 되었다.

 

컴파일러가 기반 클래스의 기본생성자로 접근하게끔 코드가 변형되는데

private 영역에 있기 때문에 상속 하는 객체들이 접근하지 못하는 것이다.

▶ [C++] 상속 관계에서 생성자 호출순서와 명시적 호출이란?  

 

[C++] 상속 관계에서 생성자 호출순서와 명시적 호출이란?

앞서 C++에서 상속 형태에 대해서 알고 싶은 경우에는 아래 글 참고 ▶ [C++] 상속(inheritance)이란? [C++] 상속(inheritance)이란? - 기존 객체 속성을 물려받아 새로운 객체를 만든다. - 동물 ㄴ 개, 고양

zoosso.tistory.com

 

protected 생성자

#include <iostream>

class Animal
{
protected:
    Animal() {}
};

class Harbang : public Animal
{
public:
    Harbang() {} // => Harbang() : Animal() {}
};

int main()
{
    // Animal animal; // error
    Harbang harbang;
}

이제는 Animal 객체가 단독으로 인스터스 생성되는 것을 막는 것이 가능해졌고,

파생 클래스들도 접근 되는 형태가 되었다.

 

protected 키워드를 처음 접하면 접근성에 있어서

자기자신과 상속받은 클래스에서 접근하기 위한 용도로만 알고있는 경우가 많다.

 

"protected 생성자" 로: 자기 자신은 만들어지지 않는 추상적인 존재이면서

파생 클래스로 하여금 구체적으로 만들 수 있게 해주는 역할을 수행한다.

 

상속 관계에 있어서 protected 키워드도 같이 생각해 볼 수 있는 내용이다.

    ex) 추상적인(Abstract)  구체적(Concrete) 관계 모델링

단순하게만 만든다면 public 키워드를 사용해도 되겠지만

구현하고자 하는 상속 관계에 맞게 설계되었는지 확인해보자.

반응형

댓글