5 minute read

🔭프로그램 설명

  • 이전에 정의한 Account 클래스를 상속하는 다음 두 클래스를 추가로 정의하고자 한다
    • NormalAccount 보통예금계좌 : 최소한의 이자를 지급하는 자율 입출금식 계좌
    • HighCreditAccount 신용신뢰계좌 : 신용도가 높은 고객에게만 개설을 허용하는 높은 이율의 계좌
  • NormalAccount 클래스는 객체의 생성과정에서 이율정보를 등록할 수 있도록 정의하자
  • HighCreditAccount 클래스는 다음과 같이 정의하자
    • 객체 생성과정에서 기본 이율을 등록할 수 있다.
    • 신용등급을 a,b,c로 나눈고 계좌개설 시 이 정보를 등록한다
    • 등급별로 각각 기본 이율에 7,4,2%의 이율을 추가로 제공한다
  • 모든 계좌에 적용하는 조건
    • 계좌 개설과정 초기에 입금되는 금액에 대해서는 이자를 계산하지 않는다
    • 개설 후 별도의 입금과정을 거칠 때만 이자가 발생하는 것으로 간주한다
    • 이자 계산 과정 중 발생하는 소수점 이하 금액은 무시한다

🖥️구현

  • 헤더

    #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;
      virtual 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() const;	// 시스템 안내
      void CreateAccount();		// 계좌 개설
      void DepositMoney();		// 입금
      void WithdrawMoney();		// 출금
      void InquiryAcc() const;	// 잔액조회
    
    protected:
      void MakeNormalAcc();
      void MakeHighCreditAcc();
    };
    
    class NormalAccount : public Account {
    public:
      NormalAccount(int id, char* name, int balance, int interestRate);
      ~NormalAccount();
        
    private:
      int m_iInterRate;
    public:
      int Deposit(int money);
    
    };
    
    class HighCreditAccount : public Account {
    public:
      HighCreditAccount(int id, char* name, int balance, int interestRate, int creditlevel);
      ~HighCreditAccount();
    private:
      int m_iInterRate;
      int m_iCreditLevel;
    public:
      int Deposit(int money);
    };
    
  • cpp

    /*
    * Banking System Ver 0.6
    * author : YEJIN LEE
    * contents : Inheritance 상속
    */
    
    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    #include<cstring>
    #include "Stage_6.h"
    
    using namespace std;
    
    enum { DEPOSIT = 1, WITHDRAW, CREATE, INQUIRY, EXIT };
    enum { LEVEL_A = 7, LEVEL_B = 4, LEVEL_C = 2 };
    enum { NormalAcc = 1, HighCreditAcc };
    
    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;
    }
    
    //////////////// 보통예금계좌 //////////////////
    NormalAccount::NormalAccount(int id, char* name, int balance, int interestRate) 
      : Account(id, name, balance), m_iInterRate(interestRate)
    {
        
    }
    NormalAccount::~NormalAccount() {
    
    }
    
    int NormalAccount::Deposit(int money) {
      money = (1 + 0.01*m_iInterRate)*money;		//이자와 원금을 합친 돈으로, 최종적으로 입금될 금액
      return Account::Deposit(money);
    }
    
    //////////////// 신용신뢰계좌 //////////////////
    HighCreditAccount::HighCreditAccount(int id, char* name, int balance, int interestRate, int creditlevel) 
      : Account(id, name, balance), m_iInterRate(interestRate), m_iCreditLevel(creditlevel)
    {
    
    }
    
    HighCreditAccount::~HighCreditAccount() {
    
    }
    int HighCreditAccount::Deposit(int money) {
      int inter = m_iInterRate + m_iCreditLevel;
      money = (1 + 0.01 * inter) * money;
      return Account::Deposit(money);
    }
    
    //////////////////// 은행 //////////////////////
    
    BankSystem::BankSystem() : m_NumOfAcc(0)
    {
    }
    
    BankSystem::~BankSystem()
    {
      delete[]m_pAccs;
    }
    
    void BankSystem::AnnounceSys() const {
    
      cout << "----- Menu -----" << endl;
      cout << "1. 입    금" << endl;
      cout << "2. 출    금" << endl;
      cout << "3. 개    설" << endl;
      cout << "4. 계좌정보" << endl;
      cout << "5. 종    료" << endl;
    
    }
    
    void BankSystem::CreateAccount() {
      int acc;
    
      cout << "[계좌선택]" << endl;
      cout << "1. 보통예금계좌" << endl;
      cout << "2. 신용신뢰계좌" << endl;
      cout << "선택 : " << endl;
      cin >> acc;
    
      if (acc == NormalAcc) {
        MakeNormalAcc();
      }
      else
        MakeHighCreditAcc();
        
    }
    
    void BankSystem::MakeNormalAcc() {
      int id;
      char name[NAME_LEN];
      int money;
      int interestRate;
    
      cout << "계좌번호 : " << endl; cin >> id;
      cout << "이    름 : " << endl; cin >> name;
      cout << "잔    액 : " << endl; cin >> money;
      cout << "이    자 : " << endl; cin >> interestRate;
        
      m_pAccs[m_NumOfAcc++] = new NormalAccount(id, name, money, interestRate);
    }
    
    void BankSystem::MakeHighCreditAcc() {
      int id;
      char name[NAME_LEN];
      int money;
      int interestRate;
      int level;
    
      cout << "계좌번호 : " << endl; cin >> id;
      cout << "이    름 : " << endl; cin >> name;
      cout << "잔    액 : " << endl; cin >> money;
      cout << "이    자 : " << endl; cin >> interestRate;
      cout << "신용등급(1.A, 2.B, 3.C) : " << endl; cin >> level;
    
      switch (level)
      {
      case 1:
        m_pAccs[m_NumOfAcc++] = new HighCreditAccount(id, name, money, interestRate, LEVEL_A);
        break;
    
      case 2:
        m_pAccs[m_NumOfAcc++] = new HighCreditAccount(id, name, money, interestRate, LEVEL_B);
        break;
    
      case 3:
        m_pAccs[m_NumOfAcc++] = new HighCreditAccount(id, name, money, interestRate, LEVEL_C);
        break;
    
      default:
        cout << "잘못된 신용등급입니다" << endl;
        break;
      }
    
        
    }
    
    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;
    }
    
    
    

Tags: ,

Categories:

Updated: