컴퓨터를 생각해봅시다. 컴퓨터에 들어가는 제품은 노트북에도 들어갑니다.
이 경우에 부모와 자식간의 관계에 있는 클래스라 규정이며 이것은 바로 상속이라고 합니다. A notebook is a Computer이다. 이 경우 Notebook 클래스를 새롭게 정의하는 대신 computer 클래스를 확장하여 간단히 정리할 수 있습니다.
추가되는 멤버들만 기술함으로써 정의할 수 있는 것입니다.
클래스
class Computer
{
public:
string manufacturer;
string processor;
int ramSize;
int diskSize;
double processorSpeed;
double computerPower()
{
return ramSize * processorSpeed;
}
double getRamSize() { return ramSize; }
double getProcessorSpeed() { return processorSpeed; }
int getDiskSize() { return diskSize; }
};
class Notebook : public Computer
{
public:
double screenSize;
double weight;
double getScreenSize()
{
return screenSize;
}
double getWeight()
{
return weight;
}
};
이런식으로
class Notebook: public Computer
하면서 Notebook 클래스 뒤에 public Computer를 해줘서 computer를 상속해주는 것입니다. 여기서 상속의 종류는 public, private, protected가 있습니다. 이 세가지 중에 하나를 써주시면 되는 겁니다.
상속에 대한 기본적인 틀을 이해하시면 됩니다.
main함수
int main()
{
Notebook yourNotebook;
yourNotebook.manufacturer = "Dell";
yourNotebook.processor = "AMD";
yourNotebook.ramSize = 16;
yourNotebook.diskSize = 512;
yourNotebook.processorSpeed = 2.6;
yourNotebook.screenSize = 15.0;
yourNotebook.weight = 1.8;
cout << yourNotebook.computePower() << endl;
cout << yourNotebook.getScreenSize() << endl;
return 0;
}
이렇게 computer의 메서드를 다 상속받았기 때문에 computer에 있는 메서드도 사용이 가능합니다. 이것이 이제 상속의 가장 기본적인 개념입니다.
일반적으로 어떤 두 개의 클래스가 이런 관계를 있는 것을 바로 IS-A 관계에 있다고 합니다. (노트북은 일종의 컴퓨터이다) 이 두개 이상의 IS Relationship이 성립한다면 하나의 class를 확장하는 방식으로 다른 클래스를 정의할 수 있습니다.
student이기 때문에 모든 사람이 가지고 있지 않은 student만의 속성이 있습니다. 직원도 사람이기에 소속부서, 연봉 등을 가지고 직원들 중에서도 비서, 기술직 등으로 나누어질 수 있기 때문에 이 둘 사이에 성립하는 것들을 생각하다보면 계층 구조를 가지게 되는 겁니다.
상속에 의해 클래스들은 계층이 발생합니다. 계층 구조의 맨 위에는 베이스 클래스가 있고, 다른 클래스들이 직접 또는 간접적으로 상속받습니다. 이러한 상속받은 클래스들을 파생 클래스라고 합니다.
베이스 클래스는 계층 구조 내의 모든 클래스에 공통인 멤버를 정의합니다.
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
class Computer
{
private:
string manufacturer;
string processor;
int ramSize;
int diskSize;
double processorSpeed;
public:
double computePower()
{
return ramSize * processorSpeed;
}
double getRamSize() { return ramSize; }
double getProcessorSpeed() { return processorSpeed; }
int getDiskSize() { return diskSize; }
string toString()
{
string result = "Manufacturer: " + manufacturer +
"\nCPU: " + processor +
"\nRAM: " + to_string(ramSize) + " megabytes" +
"\nDisk: " + to_string(diskSize) + " gigabytes" +
"\nProcessor speed: " + to_string(processorSpeed) +
"gigahertz";
return result;
}
};
class Notebook : public Computer
{
public:
double screenSize;
double weight;
double getScreenSize()
{
return screenSize;
}
double getWeight()
{
return weight;
}
void faulty_method()
{
cout << manufacturer << endl;
}
};
int main()
{
Notebook yourNotebook;
yourNotebook.manufacturer = "Dell";
yourNotebook.processor = "AMD";
yourNotebook.ramSize = 16;
yourNotebook.diskSize = 512;
yourNotebook.processorSpeed = 2.6;
yourNotebook.screenSize = 15.0;
yourNotebook.weight = 1.8;
z
cout << yourNotebook.computePower() << endl;
cout << yourNotebook.getScreenSize() << endl;
return 0;
}
이런 private로 class를 정의를 해둘 경우 Notebook에서 class computer의 private를 사용할 수 없습니다. 하지만 상속받은 것은 내부라고 보기도 애매한데요. 모든 멤버를 상속받았기 때문에 나의 멤버라고 볼 수 있는데 이러면 상속의 의미가 없지 않느냐라고 생각할 수 있습니다.
이런 객체지향프로그래밍에서 기본규칙은 어떤 클래스를 상속받았을 때 public멤버는 어디서나 쓸 수 있는 것이기 때문에 당연히 사용할 수 있는 것이지만 private에서 외부에서 사용할 수 없으며 상속한 파생 클래스 안에서 private를 사용할 수 있게는 할 수 없습니다.
public:
public멤버는 클래스 외부에서 접근 가능합니다. 베이스 클래스의 public멤버는 파생클래스 내부에서 접근 가능합니다.
private:
private 멤버는 클래스 외부에서 접근 불가능합니다. 베이스클래스의 private 멤버는 파생클래스 내부에서도 접근 불가능합니다.
protected:
protected멤버는 클래스 외부에서 접근 불가능합니다. 하지만 베이스클래스의 protected멤버는 파생클래스 내부에서 접근이 가능합니다.
'IT 프로그래밍 > 객체지향프로그래밍' 카테고리의 다른 글
객체지향프로그래밍 그룹액티비티5 (0) | 2024.06.08 |
---|---|
[c++] Generic 프로그래밍과 Template (0) | 2024.05.29 |
[c++]포인터와 참조 설명 (0) | 2024.05.17 |
[따배시 6.12] 동적 할당 배열 (0) | 2024.05.17 |
[따배시 6.11] 메모리 동적할당 new 와 delete, 메모리누수 (0) | 2024.05.17 |