IT 프로그래밍/객체지향프로그래밍

[C++] 상속이란?

기술1 2024. 5. 24. 21:47
반응형

컴퓨터를 생각해봅시다. 컴퓨터에 들어가는 제품은 노트북에도 들어갑니다. 

 

이 경우에 부모와 자식간의 관계에 있는 클래스라 규정이며 이것은 바로 상속이라고 합니다. 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멤버는 파생클래스 내부에서 접근이 가능합니다. 

 

반응형