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

2024. 4. 16. 10:16[C++]/C++ 언어 기초

프로젝트 05 단계의 도입

 

컨트롤 클래스의 특징

  • 프로그램 전체의 기능을 담당한다. 따라서 기능적 성격이 강한 클래스이다.
  • 컨트롤 클래스만 봐도 프로그램의 전체 기능과 흐름을 파악할 수 있다.

반면, 컨트롤 클래스가 아닌 대부분의 클래스를 가리켜 'Entity 클래스' 라 한다.

 

Entity 클래스의 특징

  • 데이터적 성격이 강하다. 따라서 파일 및 데이터 베이스에 저장되는 데이터를 소유하고 있다.
  • 프로그램의 기능을 파악하는데 도움을 주지는 못한다.
  • 그러나 프로그램상에서 관리되는 데이터의 종류를 파악하는 데는 도움이 된다.

 

프로그램 설명

 

우리가 구현하고 있는 Bangking System 의 주요기능은 다음과 같다. (버전 0.4)

  • 계좌개설
  • 입 금
  • 출 금
  • 계좌정보 전체 출력

이러한 기능은 전역함수를 통해서 구현되어 있다. 그러나 객체지향에서는 '전역' 이라는 개념이 존재하지 않는다. 비록 C++ 에서는 전역함수와 전역변수의 선언을 허용하고 있지만, 이는 객체지향 프로그래밍을 위한것은 아니니 가급적 사용하지 않는 것이 좋다. 기능적 성격이 강한 컨트롤 클래스를 등장시키면, 우리가 구현하고 있는 단계별 프로젝트에서 전역함수들을 없앨 수 있다.

 

버전 0.5 에서 구현해야 할 컨트롤 클래스의 구현방법

  • AccountHandler 라는 이름의 컨트롤 클래스를 정의하고, 앞서 정의한 전역함수들을 이 클래스의 멤버함수에 포함시킨다.
  • Account 객체의 저장을 위해 선언한 배열과 변수도 이 클래스의 멤버에 포함시킨다.
  • AccountHandler 클래스 기반으로 프로그램이 실행되도록 main 함수를 변경한다.

 

05단계 코드

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

using namespace std;

enum {Make = 1, Deposit, Withdraw, ShowAcc, EXIT};

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

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

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

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)
		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;
}


//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();
};

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 id, money;
	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<<endl;

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

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];
	}
}

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;
}

 

 

 

 

 

 

 

 


기존 코드

01 단계 코드

https://kjy1ho.tistory.com/337

 

01-06 은행계좌프로그램 실습 1단계

프로그램 설명 우리가 구현하고자 하는것은 "은행계좌 관리 프로그램"이다. 1단계에서는 C스타일로 구현하는 것을 목표로 한다. 구현할 기능은 다음과 같다. 기능 1. 계좌개설 기능 2. 입 금 기능

kjy1ho.tistory.com

02단계 코드

https://kjy1ho.tistory.com/351

 

04-05 은행계좌문제 2단계

01단계 코드 #include "stdafx.h" #include using namespace std; using namespace System; void ShowMenu(void); void MakeAcc(void); void DepositMoney(void); void WithdrawMoney(void); void ShowAccInfo(void); enum {Make = 1, Deposit, Withdraw, ShowAcc}; typed

kjy1ho.tistory.com

03단계 코드

https://kjy1ho.tistory.com/355

 

05-4 은행계좌프로그램 실습 3단계

프로젝트 03단계의 도입 깊은 복사를 원칙으로 한다면, 클래스의 생성자만 봐도 복사 생성자의 필요성을 판단할 수 있다. 실제 복사 생성자의 호출 여부는 중요하지 않다. 클래스는 그 자체로 완

kjy1ho.tistory.com

4단계 코드

https://kjy1ho.tistory.com/359

 

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

프로젝트 04 단계의 도입 여러 Chapter를 통해서 const에 대해 설명하였으니, 우리가 진행하는 프로젝트에도 const 선언을 추가해서 코드의 안전성을 높여보겠다. 프로그램 설명 Account 클래스의 멤버

kjy1ho.tistory.com

 

반응형