/*
우리가 구현하고 있는 Banking System의 주요기능은 다음과 같다
1.계좌개설
2.입금
3.출금
4.계좌정보 전체 출력
이러한 기능은 전역함수를 통해서 구현되어있다. 그러나 객체 지향에는 '전역'이라는 개념이 존재하지 않는다.
비록 C++에서는 전역함수와 전역변수의 선언을 허용하고 있지만, 이는 객체지향 프로그래밍을 위한 것은 아니니 가급적 사용하지 않는 것이 좋다
기능적 성격이 강한 컨트롤 클래스를 등장시키면, 우리가 구현하고 있는 단계별 프로젝트에서 전역함수들을 없앨 수 있다.
이들을 하나의 컨트롤 클래스로 묶을 수 있기 때문이다.
이렇게 되면 컨트롤 클래스는 프로그램의 기능적 측면을 담당하게 되므로, 컨트롤 클래스의 성격에도 부합한다.
그럼 이번 단계에서 구현해야 할 컨트롤 클래스의 구현방법에 대해서 간단히 말씀 드리겠다.
1.AccountHandler라는 이름의 컨트롤 클래스를 정의하고, 앞서 정의한 전역함수들을 이 클래스의 멤버함수에 포함시킨다
2.BankAccount 객체의 저장을 위해 선언한 배열과 변수도 이 클래스의 멤버에 포함시킨다
3.AccountHandler 클래스 기반으로 프로그램이 실행되도록 main 함수를 변경한다
*/
#include <iostream>
#include <cstring>
using namespace std;
//Entity 클래스
class BankAccount
{
private:
int AccountNumber; //계좌 번호
char *Name; //고객 이름
int Money; //고객의 잔액
public:
BankAccount(int num, char *name, int money);//생성자
BankAccount(const BankAccount ©);//추가된 복사생성자(나름 간단), const 추가
int GetNumber() const;//const 추가
void Deposit(int money);
int Withdraw(int money);
void ShowAccountInfo() const; //const 추가
~BankAccount(); //소멸자
};
BankAccount::BankAccount(int num, char *name, int money) :AccountNumber(num), Money(money) //생성자
{
Name = new char[strlen(name) + 1];
strcpy(Name, name);
}
BankAccount::BankAccount(const BankAccount ©) :AccountNumber(copy.AccountNumber), Money(copy.Money) //추가된 복사생성자(나름 간단), const 추가
{
Name = new char[strlen(copy.Name) + 1];
strcpy(Name, copy.Name);
}
int BankAccount::GetNumber() const //const 추가
{
return AccountNumber;
}
void BankAccount::Deposit(int money)
{
Money += money;
}
int BankAccount::Withdraw(int money)
{
if (Money < money)
return 0;
Money -= money;
return money;
}
void BankAccount::ShowAccountInfo() const //const 추가
{
cout << "이름:" << Name << endl;
cout << "계좌번호:" << AccountNumber << endl;
cout << "잔고:" << Money << endl;
}
BankAccount::~BankAccount() //소멸자
{
delete[]Name;
}
//컨트롤 클래스
class AccountHandler
{
private:
BankAccount *Arr[10]; //계좌 포인터 배열
int AccountNum; //계좌 개수
public:
AccountHandler();
~AccountHandler();
int Menu(void); //메뉴
void MakeBankAccount(void); //계좌 개설
void Deposit(int money); //입금
void Withdraw(int money); //출금
void ShowAccountInfo(void); //전체고객 잔액조회
};
AccountHandler::AccountHandler() :AccountNum(0)
{
}
AccountHandler::~AccountHandler()
{
for (int i = 0; i < AccountNum; i++)
delete Arr[i];
}
int AccountHandler::Menu(void)
{
int sel;
cout << "-----Menu-----" << endl;
cout << "1.계좌개설" << endl << "2.입금" << endl << "3.출금" << endl << "4.계좌정보 전체 출력" << endl << "5.프로그램 종료" << endl;
cout << "선택";
cin >> sel;
return sel;
}
void AccountHandler::MakeBankAccount()
{
int accountNumber;
char name[30];
int money;
cout << AccountNum + 1 << "번째 사람 정보 입력" << endl;
cout << "계좌번호 입력:";
cin >> accountNumber;
cout << "이름 입력:";
cin >> name;
cout << "잔액 입력:";
cin >> money;
cout << endl;
Arr[AccountNum++] = new BankAccount(accountNumber, name, money); //계좌개설 완료 후 다음 사람으로
}
void AccountHandler::Deposit(int money)
{
int number;
cout << "고객님의 계좌번호를 입력해주세요:";
cin >> number;
for (int i = 0; i <= AccountNum; i++)
{
if (Arr[i]->GetNumber() == number) //계좌번호가 같으면
{
Arr[i]->Deposit(money);
cout << "입금이 완료되었습니다" << endl;
return;
}
}
cout << "없는 계좌번호입니다" << endl;
}
void AccountHandler::Withdraw(int money)
{
int number;
cout << "고객님의 계좌번호를 입력해주세요:";
cin >> number;
for (int i = 0; i <= AccountNum; i++)
{
if (Arr[i]->GetNumber() == number) //계좌번호가 같으면
{
if (Arr[i]->Withdraw(money) == 0)
{
cout << "잔액이 부족합니다" << endl;
return;
}
cout << "출금이 완료되었습니다" << endl;
return;
}
}
cout << "없는 계좌번호입니다" << endl;
}
void AccountHandler::ShowAccountInfo(void)
{
for (int i = 0; i < AccountNum; i++)
{
Arr[i]->ShowAccountInfo();
cout << endl;
}
}
int main(void)
{
AccountHandler handler;
int money;
while (1)
{
int sel = handler.Menu();
switch (sel)
{
case 1:
handler.MakeBankAccount();
break;
case 2:
cout << "입금할 금액:";
cin >> money;
handler.Deposit(money);
break;
case 3:
cout << "출금할 금액:";
cin >> money;
handler.Withdraw(money);
break;
case 4:
handler.ShowAccountInfo();
break;
case 5:
//이제 소멸자가 있으니 주석처리된 부분은 필요없다
/*
for (int i = 0; i < handler.AccountNum; i++) //포인터배열을 동적할당했으므로
delete Arr[i];
*/
return 0;
default:
cout << "잘못된 번호를 입력하셨습니다" << endl;
}
}
return 0;
}
개발 환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 열혈 C++ 프로그래밍 윤성우 저
'C++ > 열혈 C++ 프로그래밍(윤성우 저)' 카테고리의 다른 글
OOP 단계별 프로젝트 6 (0) | 2017.06.06 |
---|---|
열혈 C++ 프로그래밍 8-1 문제 (0) | 2017.06.06 |
열혈 C++ 프로그래밍 7-2 문제 (0) | 2017.06.05 |
열혈 C++ 프로그래밍 7-1 문제 (0) | 2017.06.05 |
OOP 단계별 프로젝트 4 (0) | 2017.06.03 |