은행계좌프로그램 실습 7단계

2024. 4. 25. 14:11[C++]/C++ 언어 기초

단계별 프로젝트를 더 이상 진행하기에 앞서 하나의 파일을 여러 개로 나눠서 내용을 정리할 필요가 있다. 하나의 파일 안에 모든 것이 다 들어있어서 내용파악이 쉽지 않기 때문이다. 그래서 이번 단계에서는 파일을 분할하고자 한다.

 

프로젝트 07단계의 도입

각각의 클래스마다 선언은 .h파일에, 정의는 .cpp 파일에 저장하는 것이 좋다. 이렇게 되면 프로그램을 관리하기도 좋고, 또클래스의 구성이 한눈에 들어오기 때문에 프로그램의 내용을 파악하기도 수월해진다. 짧은 프로그램이라 할지라도 하나의 파일에 필요한 모든 요소를 담는 것은 바람직하지 못하다.

 

프로그램 설명

비록 조금 늦었지만, 지금이라도 프로그램을 여러 개의 파일에 나눠서 관리를 하자. 예를 들어서 Simple이라는 이름의 클래스가 있다면, Simple.h와 Simple.cpp 파일을 만들자, 그리고 Simple.h에는 클래스의 선언을, Simple.cpp는 클래스의 정의(멤버함수의 정의)를 담자. 그리하여 다음의 구조로 파일을 분할하자.

 

  • Account.h, Account.cpp                      // Account 클래스의 선언과 정의
  • NormalAccount.h                              // NormalAccount 클래스의 선언과 정
  • HighCreditAccount.h                          // HighCreditAccount 클래스의 선언과 정의
  • AccountHandler.h, AccountHandler.cpp    // AccountHandler 클래스의 선언과 정의
  • BankingCommonDecl.h                      // 공통헤더 및 상수선언들
  • BankingSystemMain.cpp                    // main 함수의 정의

 

여기서 NormalAccount 클래스와 HighCreditAccount 클래스는 크기가 작은 관계로 멤버함수의 정의를 별도의 파일에 분리하지 않고 헤더파일에 모두 삽입하는 형태로 파일을 분할하자.

 

 

Accounts.h

#ifndef __ACCOUNTS_H__
#define __ACCOUNTS_H__


//Accounts Entity Class
class Accounts
{ 
private:
	int accId;
	int money;
	char *cusName;
public:
	Accounts(int Id, int mymoney, char *name);
	Accounts(const Accounts &copy);

	virtual void Deposit(int mymoney);
	int Withdraw(int mymoney);
	void ShowAccInfo() const;

	int GetAccId() const;
	char* GetCusName() const;
	int GetMoney() const;
	~Accounts();
};

#endif

 

 

Accounts.cpp

#include "stdafx.h"
#include "BankingCommonDecl.h"
#include "Accounts.h"


Accounts::Accounts(int ID, int money, char *name):accId(ID), money(money){
	cusName = new char[strlen(name)+1];
	strcpy_s(cusName,strlen(name)+1, name);
}

Accounts::Accounts(const Accounts &copy){
	cusName = new char[strlen(copy.cusName)+1];
	strcpy_s(cusName, strlen(copy.cusName)+1, copy.cusName);
}

void Accounts::Deposit(int mymoney){money+=mymoney;}

int Accounts::Withdraw(int mymoney){
	if(money < mymoney){
		cout<<"계좌에 잔액이 부족합니다."<<endl;
		return 0;
	}
	money -= mymoney;
	return mymoney;
}

void Accounts::ShowAccInfo() const {
	cout<<"계좌Id: "<<accId<<endl;
	cout<<"이름: "<<cusName<<endl;
	cout<<"잔액: "<<money<<endl<<endl;
}

int Accounts::GetAccId() const{return accId;}
char* Accounts::GetCusName() const {return cusName;}
int Accounts::GetMoney() const {return money;}

Accounts::~Accounts(){
	delete []cusName;
}

 

 

NormalAccount.h

#ifndef __NORMAL_ACCOUNT_H__
#define __NORMAL_ACCOUNT_H__

#include "Accounts.h"

/*Normal Account Class : Account Class 상속*/
class NormalAccount : public Accounts{
private:
	int rate;
public:
	NormalAccount(int accId, int money, char *cusName, int ratio):Accounts(accId, money, cusName), rate(ratio){}
	virtual void Deposit(int money){
		Accounts::Deposit(money);
		Accounts::Deposit(money*(rate/100.0));
	}
};

#endif

 

HighCreditAccount.h

#ifndef __HIGHCREDIT_ACCOUNT_H__
#define __HIGHCREDIT_ACCOUNT_H__
#include "NormalAccount.h"

/*HighCredit Account Class : Account Class 상속*/
class HighCreditAccount : public NormalAccount{
private:
	int creditrank;
public:
	HighCreditAccount(int accId, int money, char *cusName, int ratio, int ranks):NormalAccount(accId, money, cusName, ratio), creditrank(ranks){}
	virtual void Deposit(int money){
		//입금할 때, 기본급 + 기본 이자 + 등급 추가 이자(A = 7%, B = 4%, C = 2%) 
		NormalAccount::Deposit(money);
		Accounts::Deposit(money*(creditrank/100.0));
	}
};

#endif

 

 

AccountsHandler.h

#ifndef __ACCOUNT_HANDLER_H__
#define __ACCOUNT_HANDLER_H__

#include "Accounts.h"

/*Acounts Control Class*/
class AccountsHandler{
private:
	Accounts *accArr[100];
	int accNum;
public:
	AccountsHandler();
	void ShowMenu(void) const;
	void MakeAcc(void);
	void DepositMoney(void);
	void WithdrawMoney(void);
	void ShowAllAccInfo(void);
	~AccountsHandler();
protected:
	void MakeNormalAcc(void);
	void MakeCreditAcc(void);

};

#endif

 

 

AccountsHandler.cpp

#include "stdafx.h"
#include "Accounts.h"
#include "AccountsHandler.h"
#include "BankingCommonDecl.h"
#include "NormalAccount.h"
#include "HighCreditAccount.h"

AccountsHandler::AccountsHandler():accNum(0){}

void AccountsHandler::ShowMenu(void) const{

	cout<<"-------Menu-------"<<endl<<"1. 계좌개설"<<endl<<"2. 입 금"<<endl<<"3. 출 금"<<endl<<"4. 계좌정보 전체 출력"<<endl<<"5. 프로그램 종료"<<endl;
}

void AccountsHandler::MakeAcc(void){
	int acc;

	cout<<"[계좌종류선택]"<<endl<<"1. 보통예금계좌 "<<"2. 신용신뢰계좌"<<endl;
	cout<<"선택: ";cin>>acc;

	if(acc == Normal)
		MakeNormalAcc();
	else
		MakeCreditAcc();
}

void AccountsHandler::MakeNormalAcc(void){
	int id, money, rate;
	char name[20];

	cout<<"[보통예금계좌 개설]"<<endl;
	cout<<"계좌ID: ";
	while (!(cin >> id)) {      
		cin.clear();      
		cin.ignore(INT_MAX,'\n');      
		cout << "잘못된 값을 입력하셨습니다. 정수로 입력해주세요 \n";
		cout <<"계좌 ID: ";
	}
	cout<<"이름(최대 20자): "; cin>>name;
	cout<<"입금액: "; cin>>money; 
	cout<<"이자율: "; cin>>rate; 
	cout<<endl;

	accArr[accNum++] = new NormalAccount(id, money, name, rate);
}

void AccountsHandler::MakeCreditAcc(void){
	int id, money, rate, ranks;
	char name[20];
	cout<<"[신용신뢰계좌 개설]"<<endl;
	cout<<"계좌ID: ";
	while (!(cin >> id)) {      
		cin.clear();      
		cin.ignore(INT_MAX,'\n');      
		cout << "잘못된 값을 입력하셨습니다. 정수로 입력해주세요 \n";
		cout <<"계좌 ID: ";
	}
	cout<<"이름(최대 20자): "; cin>>name;
	cout<<"입금액: "; cin>>money; 
	cout<<"이자율: "; cin>>rate;
	cout<<"신용등급(1toA, 2toB, 3toC): "; cin>>ranks; 
	cout<<endl;

	switch(ranks){
	case 1:
		accArr[accNum++] = new HighCreditAccount(id, money, name, rate, LEVEL_A);
		break;
	case 2:
		accArr[accNum++] = new HighCreditAccount(id, money, name, rate, LEVEL_B);
		break;
	case 3:
		accArr[accNum++] = new HighCreditAccount(id, money, name, rate, LEVEL_C);
		break;

	}

}

void AccountsHandler::DepositMoney(void){
	int id, money;
	cout<<"[입   금]"<<endl;
	cout<<"계좌ID: ";
	while (!(cin >> id)) {      
		cin.clear();      
		cin.ignore(INT_MAX,'\n');      
		cout << "잘못된 값을 입력하셨습니다. 정수로 입력해주세요 \n";
		cout <<"계좌 ID: ";
	}
	cout<<"입금액: ";cin>>money;

	for(int i = 0; i<accNum; i++){
		if(accArr[i] -> GetAccId() == id){
			accArr[i] -> Deposit(money);
			cout<<"입금완료"<<endl;
			cout<<accArr[i]->GetCusName()<<"고객님의 입금 후 잔액 : "<<accArr[i]->GetMoney()<<endl;
			return;
		}
	}
	cout<<"아이디가 없습니다."<<endl;
}

void AccountsHandler::WithdrawMoney(void){
	int id, money;
	cout<<"[출   금]"<<endl;
	cout<<"계좌ID: ";
	while (!(cin >> id)) {      
		cin.clear();      
		cin.ignore(INT_MAX,'\n');      
		cout << "잘못된 값을 입력하셨습니다. 정수로 입력해주세요."<<endl;
		cout <<"계좌 ID: ";
	}
	cout<<"출금액: ";
	while (!(cin >> money)) {      
		cin.clear();      
		cin.ignore(INT_MAX,'\n');      
		cout << "잘못된 값을 입력하셨습니다."<<endl;
		cout <<"출금액: ";
	}   

	for(int i = 0; i<accNum; i++){
		if(accArr[i] -> GetAccId() == id){

			if(accArr[i] ->Withdraw(money) == 0){
				cout<<"잔액부족"<<endl<<endl;
				return ;
			}

			cout<<"출금완료"<<endl;
			cout<<accArr[i]->GetCusName()<<"고객님의 출금 후 잔액 : "<<accArr[i]->GetMoney()<<endl;

			return;
		}
	}

	cout<<"아이디가 없습니다."<<endl;
}

//계좌정보 전체 출력
void AccountsHandler::ShowAllAccInfo(void){

	for(int i = 0; i<accNum;i++){
		cout<<"["<<i+1<<"번째 계좌정보]"<<endl;
		accArr[i] -> ShowAccInfo();
		if(i+1 == accNum){
			cout<<"-------전체 계좌 출력 완료-------"<<endl<<endl;
		}
	}
}

AccountsHandler::~AccountsHandler(){
	for(int i = 0; i<accNum; i++){

		delete accArr[i];
	}
}

 

BankingCommonDecl.h

#ifndef __BANKING_COMMON_H__
#define __BANKING_COMMON_H__

#include "stdafx.h"
#include <iostream>
#include <cstring>

using namespace std;

/* enum */
//선택 메뉴
enum {Make = 1, Deposit, Withdraw, ShowAcc, EXIT};
//계좌 종류
enum {Normal = 1, Credit = 2};
//신용등급
enum{LEVEL_A = 7, LEVEL_B = 4, LEVEL_C = 2};

#endif

 

 

BankingSystemMain.cpp(main함수)

#include "stdafx.h"
#include "BankingCommonDecl.h"
#include "AccountsHandler.h"


int main(void)
{
	AccountsHandler manager;
	int select;

	while(1){
		manager.ShowMenu();
		cout<<"번호를 입력하세요. : ";cin>>select;
		cout<<endl;

		switch(select){
		case Make:
			manager.MakeAcc();
			break;
		case Deposit:
			manager.DepositMoney();
			break;
		case Withdraw:
			manager.WithdrawMoney();
			break;
		case ShowAcc:
			manager.ShowAllAccInfo();
			break;
		case EXIT:
			return 0;
		default:
			cout<<"유효하지 않은 번호입니다."<<endl<<endl;
		}
	}   
	return 0;
}

 

https://learn.microsoft.com/ko-kr/cpp/preprocessor/hash-ifdef-and-hash-ifndef-directives-c-cpp?view=msvc-170

 

#ifdef 및 #ifndef 지시문(C/C++)

자세한 정보: #ifdef 및 #ifndef 지시문(C/C++)

learn.microsoft.com

 

반응형