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 ©);
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 ©){
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
'[C++] > C++ 언어 기초' 카테고리의 다른 글
29. [C++] 가상 함수(Virtual Function) (0) | 2024.04.16 |
---|---|
28. [C++] 객체 포인터의 참조 관계 (0) | 2024.04.16 |
27. [C++] 상속을 위한 조건 (0) | 2024.04.15 |
25. [C++] 상속의 문법적인 이해 (0) | 2024.04.15 |
은행계좌프로그램 실습 4단계 (0) | 2024.04.15 |