728x90
728x90
파일을 분할해본다. 각각의 클래스마다 선언은 .h파일에, 정의는 .cpp 파일에 저장한다.
프로그램 관리가 편해지고, 클래스의 구성이 한 눈에 들어와서 프로그램 내용 파악이 수월해진다.
6단계에서도 나눴었으나 좀 더 체계적으로 나누었다.
과거 진행한 OOP 단계별 프로젝트
[윤성우 열혈 c++] OOP 단계별 프로젝트 01단계
[윤성우 열혈 c++] OOP 단계별 프로젝트 02단계
[윤성우 열혈 c++] OOP 단계별 프로젝트 03단계
[윤성우 열혈 c++] OOP 단계별 프로젝트 04단계
[윤성우 열혈 c++] OOP 단계별 프로젝트 05단계
[윤성우 열혈 c++] OOP 단계별 프로젝트 06단계
프로그램 설명
다음의 구조로 파일 분할을 해 보자.
Account.h, Account.cpp
NormalAccount.h, NormalAccount.cpp
HighCreditAccount.h, HighCreditAccount.cpp
AccountHandler.h, AccountHandler.cpp
BankingCommonDecl.h ---- 공통헤더 및 상수 선언들
BankingSystemMain.cpp ---- main 함수의 정의
Account.h
#pragma once
/**
* 파일이름 : Account.h
* 작성자 : 코딩맛집
* 업데이트 정보 : 2021-11-18 파일버전 0.7
* 계좌
*/
#ifndef __ACCOUNT_H__
#define __ACCOUNT_H__
class Account {
private:
int accID; //계좌 ID
int balance; // 잔액
char* cusName; //고객이름
public:
Account(int _accID, int _balance, char* _name); //생성자
Account(const Account& ref); //복사생성자
int GetAccID() const; // 계좌 ID 반환
virtual void Deposit(int money); // 입금 //virtual 추가
int WithDraw(int money); // 출금
void ShowAccInfo() const; // 개인계좌조회
~Account(); // 소멸자
};
#endif
Account.cpp
/**
* 파일이름 : Account.cpp
* 작성자 : 코딩맛집
* 업데이트 정보 : 2021-11-18 파일버전 0.7
* 계좌
*/
#include "BankingCommonDecl.h"
#include "Account.h"
// Account 생성자
Account::Account(int _accID, int _balance, char* _name) // 계좌개설 - ID, 고객이름, 돈
: accID(_accID), balance(_balance)
{
cusName = new char[strlen(_name) + 1]; //고객이름 객체 포인터로 동적할당
strcpy(cusName, _name);
}
// 실제 호출되지는 않는 Account복사생성자
// 깊은 복사를 원칙으로 정의
Account::Account(const Account& ref)
: accID(ref.accID), balance(ref.balance)
{
cusName = new char[strlen(ref.cusName) + 1]; //고객이름 객체 포인터로 동적할당
strcpy(cusName, ref.cusName);
}
// Account 소멸자
Account::~Account() // 소멸자
{
delete[] cusName;
}
// 계좌 ID 반환
int Account::GetAccID() const // 내부 출력문이나 값의 변동이 없는 경우 const
{
return accID;
}
// 개인 계좌조회
void Account::ShowAccInfo() const
{
// 내부 출력문이나 값의 변동이 없는 경우 const
cout << "계좌ID: " << accID << endl;
cout << "이름: " << cusName << endl;
cout << "잔액: " << balance << endl << endl;
}
// 입출금
void Account::Deposit(int money)
{
balance += money;
}
int Account::WithDraw(int money)
{
if (balance < money) //잔액<출금액
{
return 0;
}
balance -= money;
return money;
}
NormalAccount.h, NormalAccount.cpp
#pragma once
/**
* 파일이름 : NormalAccount.h
* 작성자 : 코딩맛집
* 업데이트 정보 : 2021-11-18 파일버전 0.7
* 요약 : 보통예금계좌
* 객체를 생성할 때 계좌 기본이율을 등록할 수 있다
* 계좌개설 과정 초기 입금액은 이자가 붙지 않는다.
* 이자계산액의 소수점 이하 금액은 무시한다. (버림)
*/
#ifndef __NORMAL_ACCOUNT_H__
#define __NORMAL_ACCOUNT_H__
#include "Account.h"
class NormalAccount: public Account //Account 상속
{
public:
NormalAccount(int _accID, int _balance, char* _name, int _basicInterestRate);
~NormalAccount();
private:
int basicInterestRate; // 기본이율 (%단위)
public:
//추가된 입금 + 이자율 계산식......뒤집어쓰니까 virtual
virtual void Deposit(int money);
};
#endif
#include "NormalAccount.h"
NormalAccount::NormalAccount(int _accID, int _balance, char* _name, int _basicInterestRate)
: Account(_accID, _balance, _name), basicInterestRate(_basicInterestRate)
{ }
NormalAccount::~NormalAccount()
{ }
void NormalAccount::Deposit(int money)
{
Account::Deposit(money); //원금추가
Account::Deposit(money*(basicInterestRate/100.0)); //이자추가
}
HighCreditAccount.h
#pragma once
/**
* 파일이름 : HighCreditAccount.h
* 작성자 : 코딩맛집
* 업데이트 정보 : 2021-11-18 파일버전 0.7
* 요약 : 신용신뢰계좌
* 객체를 생성할 때 계좌 기본이율을 등록할 수 있다
* 계좌개설 과정 초기 입금액은 이자가 붙지 않는다.
* 이자계산액의 소수점 이하 금액은 무시한다. (버림)
* 신용등급 정보 A(7%), B(4%), C(2%) 셋 중 하나를 계좌개설 시 등록한다.
* 등급별 기본이율에 각각의 이율을 추가 제공한다.
*/
#ifndef __HIGHCREDIT_ACCOUNT_H__
#define __HIGHCREDIT_ACCOUNT_H__
#include "NormalAccount.h"
class HighCreditAccount : public NormalAccount
{
public:
HighCreditAccount(int _id, int _balance, char* _name, int _interRate, int _creditLevel);
~HighCreditAccount();
private:
int creditLevel; //신용등급
public:
virtual void Deposit(int money);
};
#endif
#include "HighCreditAccount.h"
HighCreditAccount::HighCreditAccount(int _id, int _balance, char* _name, int _interRate, int _creditLevel)
: NormalAccount(_id, _balance, _name, _interRate), creditLevel(_creditLevel)
{ }
HighCreditAccount::~HighCreditAccount()
{ }
void HighCreditAccount::Deposit(int money)
{
NormalAccount::Deposit(money); //원금과 이자추가
Account::Deposit(money*(creditLevel/100.0)); // 특별이자 추가
}
AccountHandler.h
#pragma once
/**
* 파일이름 : AccountHandler.h
* 작성자 : 코딩맛집
* 업데이트 정보 : 2021-11-18 파일버전 0.7
* 컨트롤 클래스
*/
#ifndef __ACCOUNT_HANDLER_H__
#define __ACCOUNT_HANDLER_H__
#include "Account.h"
class AccountHandler {
private:
Account* accArr[100]; //Account 저장을 위한 배열
int accNum; //저장된 Account 수
public:
AccountHandler(); //생성자
void ShowMenu(void) const; //메뉴출력
void MakeAccount(void); //계좌개설
void DepositMoney(void); //입금
void WithdrawMoney(void); //출금
void ShowAllAccInfo(void) const; //잔액조회
void MakeNormalAccount(); // 보통예금계좌 개설
void MakeHighCreditAccount(); // 신용신뢰계좌 개설
~AccountHandler(); //소멸자
};
#endif // !__ACCOUNT_HANDLER_H__
AccountHandler.cpp
/**
* 파일이름 : AccountHandler.h
* 작성자 : 코딩맛집
* 업데이트 정보 : 2021-11-18 파일버전 0.7
* 컨트롤 클래스
*/
#include "BankingCommonDecl.h"
#include "Account.h"
#include "AccountHandler.h"
#include "NormalAccount.h"
#include "HighCreditAccount.h"
//메뉴출력
void AccountHandler::ShowMenu(void) const {
cout << "-----Menu-----" << endl;
cout << "1. 계좌개설" << endl;
cout << "2. 입금" << endl;
cout << "3. 출금" << endl;
cout << "4. 계좌번호 전체 출력" << endl;
cout << "5. 프로그램 종료" << endl;
}
// AccountHandler 생성자
AccountHandler::AccountHandler()
: accNum(0)
{}
// AccountHandler 소멸자
AccountHandler::~AccountHandler()
{
for (int i = 0; i < accNum; i++)
{
delete accArr[i];
}
}
//계좌개설
void AccountHandler::MakeAccount(void)
{
int accountType;
cout << "[계좌종류선택]" << endl;
cout << "1. 보통예금계좌 2. 신용신뢰계좌" << endl;
cout << "선택(숫자입력) : "; cin >> accountType;
if (accountType == NORMAL) //보통예금계좌
{
MakeNormalAccount();
}
else // 신용신뢰계좌
{
MakeHighCreditAccount();
}
}
// 보통예금계좌 개설
void AccountHandler::MakeNormalAccount()
{
int id;
char name[NAME_LEN];
int balance;
int interRate;
cout << "[보통예금계좌 개설]" << endl;
cout << "계좌ID: (숫자로 입력) "; cin >> id;
cout << "이름: "; cin >> name;
cout << "입금액: "; cin >> balance;
cout << "이자율: "; cin >> interRate;
cout << endl;
accArr[accNum++] = new NormalAccount(id, balance, name, interRate);
}
// 신용신뢰계좌 개설
void AccountHandler::MakeHighCreditAccount()
{
int id;
char name[NAME_LEN];
int balance;
int interRate;
int creditLevel;
cout << "[신용신뢰계좌 개설]" << endl;
cout << "계좌ID: (숫자로 입력) "; cin >> id;
cout << "이름: "; cin >> name;
cout << "입금액: "; cin >> balance;
cout << "이자율: "; cin >> interRate;
cout << "신용등급(1toA, 2toB, 3toC이며 1, 2, 3 중 입력): "; cin >> creditLevel;
cout << endl;
// 신용등급 처리
switch (creditLevel)
{
case 1:
// 1을 입력했을 때
accArr[accNum++] = new HighCreditAccount(id, balance, name, interRate, A); //7%
break;
case 2:
accArr[accNum++] = new HighCreditAccount(id, balance, name, interRate, B); //4%
break;
case 3:
accArr[accNum++] = new HighCreditAccount(id, balance, name, interRate, C); //2%
break;
}
}
//입금
void AccountHandler::DepositMoney(void) {
int money;
int id;
cout << "[입 금]" << endl;
cout << "계좌ID: "; cin >> id;
cout << "입금액: "; cin >> money;
for (int i = 0; i < accNum; i++)
{
if (accArr[i]->GetAccID() == id)
{
accArr[i]->Deposit(money);
cout << "입금완료" << endl << endl;
return;
}
}
cout << "유효하지 않은 ID 입니다." << endl << endl;
}
//출금
void AccountHandler::WithdrawMoney(void) {
int money;
int id;
cout << "[출 금]" << endl;
cout << "계좌ID: "; cin >> id;
cout << "출금액: "; cin >> money;
for (int i = 0; i < accNum; i++)
{
if (accArr[i]->GetAccID() == id)
{
if (accArr[i]->WithDraw(money) == 0) //잔액보다 출금액이 크면
{
cout << "잔액부족" << endl << endl;
return;
}
cout << "출금완료" << endl << endl;
return;
}
}
cout << "유효하지 않은 ID 입니다" << endl << endl;
}
// 전체고객 잔액조회
void AccountHandler::ShowAllAccInfo(void) const
{
for (int i = 0; i < accNum; i++)
{
accArr[i]->ShowAccInfo();
}
}
BankingCommonDecl.h
#pragma once
/**
* 파일이름 : BankingCommonDecl.h
* 작성자 : 코딩맛집
* 업데이트 정보 : 2021-11-18 파일버전 0.7
* 공통헤더 및 상수 선언
*/
#ifndef __BANKING_COMMON_H__
#define __BANKING_COMMON_H__
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using namespace std;
const int NAME_LEN = 20;
// 프로그램 사용자의 선택 메뉴
enum { MAKE = 1, DEPOSIT, WITHDRAW, INQUIRE, EXIT };
// 계좌종류
enum AccountType { NORMAL = 1, HIGHCREDIT };
// 신용등급
enum CreditRating { A = 7, B = 4, C = 2 };
#endif; // !__BANKING_COMMON_H__
BankingSystemMain.cpp
/**
* 소프트웨어 버전 : BankingSystemMain Ver 0.7
* 소프트웨어 요약 : 은행 계좌 관리 프로그램
*
* 파일이름 : BankingSystemMain.cpp
* 작성자 : 코딩맛집
* 업데이트 정보 : 2021-11-18 파일버전 0.7
* 파일요약 : 메인함수 있는 부분
*/
#include "BankingCommonDecl.h"
#include "AccountHandler.h"
int main()
{
AccountHandler hdr;
int choice;
while (1)
{
hdr.ShowMenu(); //메뉴선택모드
cout << "선택(1~5까지의 숫자만 입력) : ";
cin >> choice;
cout << endl;
switch (choice)
{
case MAKE:
hdr.MakeAccount();
break;
case DEPOSIT:
hdr.DepositMoney();
break;
case WITHDRAW:
hdr.WithdrawMoney();
break;
case INQUIRE:
hdr.ShowAllAccInfo();
break;
case EXIT:
return 0;
default:
cout << "잘못된 선택" << endl;
}
}
return 0;
}
728x90
728x90
'C, C++ > 열혈 C++ 프로그래밍' 카테고리의 다른 글
[윤성우 열혈 c++] OOP 단계별 프로젝트 06단계 (0) | 2021.11.22 |
---|---|
[C++] 복사생성자 호출 시점 3가지 (중요) (0) | 2021.11.15 |
[윤성우 열혈 C++ 프로그래밍] 10. 연산자 오버로딩 1 (책) (0) | 2021.11.05 |
[윤성우 열혈 c++] OOP 단계별 프로젝트 05단계 (0) | 2021.11.04 |
[윤성우 열혈 c++] OOP 단계별 프로젝트 04단계 (0) | 2021.11.04 |