저번 클래스에 이어서 클래스의 상속에 관련하여 알아보고자 한다.
상속은 객체 지향 프로그래밍의 특징에 포함되는 개념인데
객체 지향 프로그래밍의 특징에 대해 더 자세히 알아보자.
객체 지향 프로그래밍은 4가지의 특징을 가지고 있는데
• 추상화
객체의 공통적인 속성과 기능을 추출하여 정의하는 것.
속성은 클래스 내에 필드(변수)로 정의 될 것이고,
기능은 클래스 내에서 메소드(함수)로 정의될 것이다.
• 캡슐화
-데이터 보호
외부로부터 클래스에 정의된 속성과 기능들을 보호
-데이터 은닉
내부의 동작을 감추고 외부에는 필요한 부분만 노출
• 상속
부모 클래스에 정의 된 속성(변수) 및 기능(메소드)들을
클래스에서 상속받아 사용하는 것
• 다형성
같은 대상이라도 문맥이나 상황에 따라 다르게 사용될 수 있다는 원리
프로그래밍: 상위(부모) 클래스로 하위(자식) 클래스의 인스턴스를 생성할 수 있음
여기서 상속에 대해 더 파헤쳐보자.
쉽게 말해 혼자 하던 붕어빵 가게가 대박이 나서 프렌차이즈화 됐다고 한다면
서울 예산 제주도 등등 여러군데에 2호점 3호점이 생길 것이다.
그럴 경우 '본점(상위클래스)'과 '분점(하위클래스)'으로 나뉘게 되는데
'본점(상위클래스)'에서 보내준 레시피를 기준으로 '분점(하위클래스)'에서 붕어빵을 만들게 된다.
'본점(상위클래스)'과 '분점(하위클래스)'은 상속관계에 속하게 된다.
여기서 앞서 설명했던 접근제어자가 등장하는데
접근제어자란
클래스의 멤버(변수, 메소드)들의 접근 권한을 지정한다.
객체 지향 언어에는 세가지 접근제어자가 존재한다.
1. Public : 공개된 정보. 외부 접근 허용.
2. Pritected : 제한된 정보. 해당 클래스나서브 클래스에서만 접근 허용.
3. Private : 제한된 정보. 해당 클래스에서만 접근 허용.
붕어빵으로 계속 설명해보자면
1. Public : 누구나 열람 가능한 붕어빵의 성분 분석표가 될 것이다.
2. Pritected : 점주들만 열람 가능한 붕어빵의 레시피가 표이다.
여기엔 붕어빵의 재료 배합 비율, 본점의 영업방침(붕어빵 1개 서비스) 등이 담겨있을 것이다.
3. Private : 비밀로 내려오는 본점만의 비법 팥양념이 담긴 레피시이다.
본점만 열람하여 조리 후 팥양념을 분점으로 분배해 줄 것이다.
본점과 마찬가지로 분점에서도 접근제어자가 별도로 생기는데
제주도에 위치한 분점이라면 감귤 붕어빵, 보성에 위치 했다면이라면 녹차 붕어빵 등
분점이 위치한 지역 특색에 맞게 레시피가 제작될 수 있을 것이다.
이것이 자식 클래스에서의 Private라고 볼 수 있다.
그럼 코드화 하여 나타내보자.
#include <iostream>
using namespace std;
class Head_Carp_bread { //객체는 "상태"와 "동작"을 가지고 있다.
protected:
string kind; //필드(변수)
int num; //필드(변수)
int Material;
public: //접근 제어자
Head_Carp_bread(string kind, int num) { //생성자
this->kind = kind;
this->num = num;
cout << kind << " 붕어빵 " << num << "개 나왔습니다." << endl;
}
void service() { //본점의 영업방침
cout << "팥붕어빵 한개 더 넣어드렸어요." << endl;
}
};
class Jeju_Carp_bread : public Head_Carp_bread
{
string Jeju_kind;
public:
Jeju_Carp_bread(string Jeju_kind, int num) : Head_Carp_bread(Jeju_kind, num) {
if (Jeju_kind == "감귤")
{
cout << "제주점에서만 맛 볼 수 있는 감귤 붕어빵입니다!" << endl<< endl;
}
}
void service() { //본점의 영업방침
cout << "팥붕어빵 한개 더 넣어드렸어요." << endl;
}
};
int main() {
cout << "----------------------------------------" << endl;
cout << "환영합니다 제철 붕어빵 제주점입니다." << endl;
string kind; //붕어빵 종류
int num; //붕어빵 수량
cout << "원하시는 붕어빵 종류를 입력하세요 : ";
cin >> kind;
cout << "원하시는 붕어빵 수량를 입력하세요 : ";
cin >> num;
cout << "----------------------------------------" << endl;
Jeju_Carp_bread cb = Jeju_Carp_bread(kind, num); //객채 선언
cb.service(); //메소드 선언
}