객체지향프로그래밍에서...
아래와 같이 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++] 상속 관계에서 생성자 호출순서와 명시적 호출이란?
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 키워드를 사용해도 되겠지만
구현하고자 하는 상속 관계에 맞게 설계되었는지 확인해보자.
'프로그래밍 언어 > C++' 카테고리의 다른 글
[STL] unique 함수 활용한 vector 중복 원소 제거 (0) | 2021.07.29 |
---|---|
[C++] [STL] Vector 사용 방법 (0) | 2021.07.26 |
[C++] 상속 관계에서 생성자 호출순서와 명시적 호출이란? (2) | 2021.07.04 |
[C++] 상속(inheritance)이란? (0) | 2021.07.04 |
[C++] lower_bound, upper_bound 사용해보기 (0) | 2021.05.16 |
댓글