1. 문제

 

8. 다음 그림과 같은 상속 구조를 갖는 클래스를 설계한다.

모든 프린터는 모델명 (model), 제조사 (manufacturer), 인쇄 매수 (prontedCount), 인쇄 종이 잔량 (availableCount)을 나타내는 정보와 print (int pages) 멤버 함수를 가지며, print()가 호출할 때마다 pages 매의 용지를 사용한다. 잉크젯 프린터는 잉크 잔량 (availableInk) 정보와 printInkJet (int pages) 멤버 함수를 추가적으로 가지며, 레이저 프린터는 토너 잔량 (availableToner) 정보와 역시 printLaser (int pages) 멤버 함수를 추가적으로 가진다. 각 클래스에 적절한 접근 지정으로 멤버 변수와 함수, 생성자, 소멸자를 작성하고, 다음과 같이 실행되도록 전체 프로그램을 완성하라. 잉크젯 프린터 객체와 레이저 프린터 객체를 각각 하나만 동적 생성하여 시작한다.

 

 

2. 결과

 

 

 

3. 코드

#include <iostream>
#include <string>
using namespace std;

class printer {
	string model;
	string manufacturer;
	int printedCount;
	int availableCount;
public :
	printer(string m, string ma, int a ) {
		model = m;
		manufacturer = ma;
		availableCount = a;
	}
	string getModel() { return model;}
	string getManu() { return manufacturer;}
	int getAvail() { return availableCount; }
	bool print(int pages) {
		printedCount = pages;
		if( availableCount >= printedCount ) {
			availableCount -= printedCount;
			return true;
		}
		else {
			cout << "용지가 부족하여 프린트할 수 없습니다." << endl;
			return false;
		}
	}
};

class Ink : public printer {
	int availableInk;
public :
	Ink(string m, string ma, int a, int aInk ) : printer( m,  ma,  a ) {
		availableInk = aInk;
	}
	void printInkJet(int pages) {
		if( print(pages) ) {
			if( availableInk >= pages ) {
				availableInk -= pages;
				cout << "프린트하였습니다." << endl;
			}
		}
	}
	void show() {
		cout << getModel() << " ," << getManu() << " ,남은 종이 " << getAvail() << "장 ,남은 잉크 " << availableInk << endl;
	}
};

class Laser : public printer {
	int availableToner;
public :
	Laser(string m, string ma, int a, int aToner ) : printer( m,  ma,  a ) {
		availableToner = aToner;
	}
	void printLaser(int pages) {
		if( print(pages) ) {
			if( availableToner >= pages ) {
			availableToner -= pages;
			cout << "프린트하였습니다." << endl;
			}
		}
	}
	void show() {
		cout << getModel() << " ," << getManu() << " ,남은 종이 " << getAvail() << "장 ,남은토너 " << availableToner << endl;
	}
};

int main() {
	Ink* IP = new Ink("Officejet V40", "HP", 5, 10);
	Laser* LP = new Laser("SCX-6x45", "삼성전자", 3, 20 );
	int n1, n2;
	char a;

	cout << "현재 작동중인 2 대의 프린터는 아래와 같다" << endl;
	cout << "잉크젯 : "; IP->show();
	cout << "레이저 : "; LP->show();

	while(1) {
		cout << endl << "프린터(1:잉크젯, 2:레이저)와 매수 입력>>";
		cin >> n1 >> n2;
		if( n1 == 1 ) 
		{
			IP->printInkJet( n2);
			IP->show();
			LP->show();
		}
		if( n1 == 2 )
		{
			LP->printLaser( n2);
			IP->show();
			LP->show();
		}
		cout << "계속 프린트 하시겠습니까(y/n)>>";
		cin >> a;
		if( a == 'n' ) break;
	}
}

 

4. 설명

 

 프린터 클래스와 프린터 클래스를 상속 받는 잉크젯 프린터 클래스, 레이저 프린터 클래스를 작성합니다.

 

문제 마지막 부분을 보면 잉크젯 프린터 객체와 레이저 프린터 객체를 각각 하나만 동적 생성하여 시작한다고 하였으므로 이에 따라 정보를 입력 받도록 생성자들을 생성 합니다.

 

Priter 클래스는 모델명, 제조사, 인쇄 종이 잔량을 매개변수로 가지는 생성자를 생성하고 Ink 와 Laser 클래스에서 각각 추가적으로 잉크 잔량과 토너 잔량을 입력 받아서 총 매개변수 갯수가 4개인 생성자를 생성합니다.

 

 

 

 Ink 클래스나 Laser 클래스의 생성자에서  ": Printer( m, ma, a )" 을 해준 것은 Printer 클래스에서 printer(string m, string ma, int a ) 생성자가 실행되도록 입니다. 이렇게 지정을 하지 않는다면 기본 생성자를 실행합니다.

 

 

 그 후 print 멤버 함수를 구현하면, print 멤버 함수는 입력받은 매개 변수와 인쇄 종이 잔량을 비교하여서 인쇄 종이 잔량이 같거나 더 많으면 True를 리턴 하고 그렇지 않다면 용지가 부족하다는 매세지를 출력 후 false를 리턴 합니다.

 

-> Ink 클래스나 Laser 클래스는 Printer의 자식 클래스이므로 Printer 클래스의 멤버 함수인 print를 사용할 수 있습니다.

 

  void printInkJet(int pages) 와 void printLaser(int pages) 에서 print 멤버 함수로 용지 잔량을 비교하여 참이였다면 각각 잉크 잔량과 토너 잔량을 비교하여서 잔량이 더 많다면 프린트를 성공 시키고, 그렇지 않으면 프린트를 실패 시킵니다.

 

 

 

 main 에서는 두 객체를 동적으로 생성한 후 while문과 if문을 사용하여서 프로그램을 진행시킵니다.

 

※ 동적으로 생성하였으므로 멤버 함수의 접근하기 위해서는 "->"를 사용하셔야 합니다.

 

+ Recent posts