[열혈 C++] OOP 단계별 프로젝트 05단계 : 컨트롤 클래스
🔭프로그램 설명
-
컨트롤 클래스를 정의해보고자 한다.
- 컨트롤 클래스 특징
- 프로그램 전체의 기능을 담당한다. 따라서 기능적 성격이 강한 클래스이다.
- 컨트롤 클래스만 봐도 프로그램의 전체 기능과 흐름을 파악할 수 있다.
- Entity 클래스 : 컨트롤 클래스가 아닌 대부분의 클래스
- 데이터적 성격이 강하다.
- 프로그램 기능을 파악하는 데 도움을 주지는 못하지만 프로그램상에서 관리되는 데이터의 종류를 파악하는 데 도움이 된다.
🖥️구현
-
교재에서는 AccountHandler라는 클래스를 정의했지만, 본인은 앞서 이미 BankSystem이라는 컨트롤 클래스를 정의해놓았기 때문에 새로운 클래스를 정의할 필요는 없었다.
-
그러나 Account클래스에 입금, 출금, 잔액확인 함수를 새로 만들어 BankSystem의 멤버함수에서 중복되는 코드를 줄이고 좀 더 간결하게 수정했다.
-
또한 헤더파일과 소스파일을 나누어 길어진 코드를 정리했다.
//Stage_5.h
#pragma once
class Account
{
public:
Account(int id, char* name, int balance);
Account(const Account& ref);
~Account();
private:
int m_Id; // 계좌번호
char* m_cpName; // 이름
int m_Balance; // 잔고
public:
int getID() const;
int Deposit(int monyey);
int Withdraw(int money);
void ShowAccInfo() const;
};
class BankSystem
{
public:
BankSystem();
~BankSystem();
private:
int m_NumOfAcc; // 계좌 개수
Account* m_pAccs[50]; // 계좌 배열
public:
void AnnounceSys(); // 시스템 안내
void CreateAccount(); // 계좌 개설
void DepositMoney(); // 입금
void WithdrawMoney(); // 출금
void InquiryAcc() const; // 잔액조회
};
/*
* Banking System Ver 0.5
* author : YEJIN LEE
* contents : 컨트롤 클래스
*/
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include "Stage_5.h"
using namespace std;
enum { DEPOSIT = 1, WITHDRAW, CREATE, INQUIRY, EXIT };
const int NAME_LEN = 10;
///////////////////// 계좌 /////////////////////////
Account::Account(int id, char* name, int balance) : m_Id(id), m_Balance(balance)
{
m_cpName = new char[strlen(name) + 1];
strcpy(m_cpName, name);
}
Account::Account(const Account& ref)
: m_Id(ref.m_Id), m_Balance(ref.m_Balance) {
m_cpName = new char[strlen(ref.m_cpName) + 1];
strcpy(m_cpName, ref.m_cpName);
}
Account::~Account()
{
delete[]m_cpName;
}
int Account::getID() const {
return m_Id;
}
int Account::Deposit(int money) {
m_Balance += money;
return money;
}
int Account::Withdraw(int money) {
if (m_Balance - money < 0) {
return -1;
}
m_Balance -= money;
return money;
}
void Account::ShowAccInfo() const {
cout << "계좌번호 : " << m_Id << endl;
cout << "이 름 : " << m_cpName << endl;
cout << "잔 액 : " << m_Balance << endl;
}
//////////////////// 은행 //////////////////////
BankSystem::BankSystem() : m_NumOfAcc(0)
{
}
BankSystem::~BankSystem()
{
delete[]m_pAccs;
}
void BankSystem::AnnounceSys() {
cout << "----- Menu -----" << endl;
cout << "1. 입 금" << endl;
cout << "2. 출 금" << endl;
cout << "3. 개 설" << endl;
cout << "4. 계좌정보" << endl;
cout << "5. 종 료" << endl;
}
void BankSystem::CreateAccount() {
int id;
char name[NAME_LEN];
int money;
cout << "계좌번호 : " << endl; cin >> id;
cout << "이 름 : " << endl; cin >> name;
cout << "잔 액 : " << endl; cin >> money;
m_pAccs[m_NumOfAcc++] = new Account(id, name, money);
}
void BankSystem::DepositMoney() {
int id;
int money;
cout << "[입금]" << endl;
cout << "계좌번호 : "; cin >> id;
cout << "입금액 : "; cin >> money;
for (int i = 0; i < m_NumOfAcc; i++) {
if (m_pAccs[i]->getID() == id) {
int retMoney = m_pAccs[i]->Deposit(money);
cout << "잔액 : " << retMoney << endl << endl;
return;
}
}
cout << "해당 계좌가 존재하지 않습니다" << endl << endl;
return;
}
void BankSystem::WithdrawMoney() {
int id;
int money;
cout << "[출금]" << endl;
cout << "계좌 ID : "; cin >> id;
cout << "출금액 : "; cin >> money;
for (int i = 0; i < m_NumOfAcc; i++) {
if (m_pAccs[i]->getID() == id) {
int retMoney = m_pAccs[i]->Deposit(money);
if (retMoney < 0) {
cout << "잔액이 부족합니다" << endl << endl;
}
cout << "잔액 : " << retMoney << endl << endl;
return;
}
}
cout << "해당 계좌가 존재하지 않습니다" << endl << endl;
return;
}
void BankSystem::InquiryAcc() const {
int id;
cout << "[계좌조회]" << endl;
cout << "계좌번호 : "; cin >> id;
cout << endl << endl;
for (int i = 0; i < m_NumOfAcc; i++) {
if (m_pAccs[i]->getID() == id) {
cout << "--------------------" << endl;
m_pAccs[i]->ShowAccInfo();
return;
}
}
cout << "해당 계좌가 존재하지 않습니다" << endl << endl;
}
int main(void) {
int option;
BankSystem shinhan;
while (true)
{
shinhan.AnnounceSys();
cout << "선택 : ";
cin >> option;
cout << endl;
switch (option)
{
case DEPOSIT:
shinhan.DepositMoney();
break;
case WITHDRAW:
shinhan.WithdrawMoney();
break;
case CREATE:
shinhan.CreateAccount();
break;
case INQUIRY:
shinhan.InquiryAcc();
break;
case EXIT:
return 0;
default:
cout << "Illegal selection" << endl;
}
}
return 0;
}