[열혈 C++] OOP 단계별 프로젝트 06단계 : 상속
🔭프로그램 설명
- 이전에 정의한 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; }