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
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v