본문 바로가기

강의자료/Class

009. 추상 클래스와 순수가상함수

◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


추상클래스란 순수가상함수를 가지고 있는 클래스를 말한다.
순수가상함수는 일반적인 가상함수와 비슷하지만, 구현부가 존재하지 않는 가상함수이다. (구현부를 만들어도 상관은 없다.)
이와같이, 순수가상함수로만 이루어진 추상클래스를 작성하게 되면, 다형성에 접근하기 위한 인터페이스 역할을 하게 된다.
# 추상클래스는 인스턴스를 생성할 수 없다.
# 자식클래스는 순수가상함수를 무조건 오버라이딩해야 한다.
# 인터페이스 : 다형성을 이용하는 매개체로서만 사용되며, 그 자신은 아무런 기능도 없는 클래스를 말한다.
#include 
using namespace std;

class Shape
{
public:
	Shape(){ }
	virtual ~Shape(){ }
	virtual float GetArea() = 0;	// 순수가상함수 - 자식 클래스에서 무조건 오러라이딩 해야 한다.
	virtual float GetPerim() = 0;	// 순수가상함수는 구현부가 없어도 된다. 하지만 있어도 된다.
	virtual void Draw() = 0;		// 이처럼 순수가상함수를 가진 클래스를 추상클래스라고 부른다.
};

void Shape::Draw()
{
	cout << "Abstract drawing mechanism!" << endl;
}

class Circle : public Shape
{
public:
	Circle(int radius):itsRadius(radius){ }
	virtual ~Circle(){ }
	float GetArea() { return 3.14f * itsRadius * itsRadius; }
	float GetPerim() { return 2 * 3.14f * itsRadius; }
	void Draw();
private:
	int itsRadius;
};

void Circle::Draw()
{
	cout << "Circle drawing routine here!" << endl;
	Shape::Draw();
}

class Rectangle : public Shape
{
public:
	Rectangle(int len, int width):itsLength(len), itsWidth(width){ }
	virtual ~Rectangle(){}
	float GetArea() { return itsLength * itsWidth; }
	float GetPerim() {return 2*itsLength + 2*itsWidth; }
	int GetLength() { return itsLength; }
	int GetWidth() { return itsWidth; }
	void Draw();
private:
	int itsWidth;
	int itsLength;
};

void Rectangle::Draw()
{
	for (int i = 0; i < itsLength; i++)
	{
		for (int j = 0; j < itsWidth; j++)
			cout << "x ";
		cout << endl;
	}
	Shape::Draw();
}

// 자식의 자식클래스는 순수가상함수를 오버라이딩하지 않아도 된다.
class Square : public Rectangle
{
public:
	Square(int len):Rectangle(len,len){ }
	virtual ~Square(){ }
	float GetPerim() {return 4 * GetLength();}
};

void main()
{
	bool fQuit = false;

	while ( !fQuit )
	{
		int choice;
		Shape * sp = NULL;

		cout << "(1)Circle (2)Rect (3)Square (0)Quit: ";
		cin >> choice;
		switch (choice)
		{
		case 0:	fQuit = true; continue; break;
		case 1: sp = new Circle(5);	break;
		case 2: sp = new Rectangle(4,6); break;
		case 3: sp = new Square(5);	break;
		default: cout << "Please enter a number(0~3)" << endl; continue; break;
		}
		sp->Draw();	delete sp; cout << endl;
	}
}