C++/열혈 C++ 프로그래밍(윤성우 저)

OOP 단계별 프로젝트 5

꾸준함. 2017. 6. 5. 14:23

/*

우리가 구현하고 있는 Banking System 주요기능은 다음과 같다

1.계좌개설

2.입금

3.출금

4.계좌정보 전체 출력

이러한 기능은 전역함수를 통해서 구현되어있다. 그러나 객체 지향에는 '전역'이라는 개념이 존재하지 않는다.

비록 C++에서는 전역함수와 전역변수의 선언을 허용하고 있지만, 이는 객체지향 프로그래밍을 위한 것은 아니니 가급적 사용하지 않는 것이 좋다

기능적 성격이 강한 컨트롤 클래스를 등장시키면, 우리가 구현하고 있는 단계별 프로젝트에서 전역함수들을 없앨 있다.

이들을 하나의 컨트롤 클래스로 묶을 있기 때문이다.

이렇게 되면 컨트롤 클래스는 프로그램의 기능적 측면을 담당하게 되므로, 컨트롤 클래스의 성격에도 부합한다.

그럼 이번 단계에서 구현해야 컨트롤 클래스의 구현방법에 대해서 간단히 말씀 드리겠다.

1.AccountHandler라는 이름의 컨트롤 클래스를 정의하고, 앞서 정의한 전역함수들을 클래스의 멤버함수에 포함시킨다

2.BankAccount 객체의 저장을 위해 선언한 배열과 변수도 클래스의 멤버에 포함시킨다

3.AccountHandler 클래스 기반으로 프로그램이 실행되도록 main 함수를 변경한다

*/

#include <iostream>

#include <cstring>

using namespace std;

 

//Entity 클래스

class BankAccount

{

private:

        int AccountNumber; //계좌 번호

        char *Name; //고객 이름

        int Money; //고객의 잔액

public:

        BankAccount(int num, char *name, int money);//생성자

        BankAccount(const BankAccount &copy);//추가된 복사생성자(나름 간단), const 추가

        int GetNumber() const;//const 추가

        void Deposit(int money);

        int Withdraw(int money);

        void ShowAccountInfo() const; //const 추가

        ~BankAccount(); //소멸자

};

 

BankAccount::BankAccount(int num, char *name, int money) :AccountNumber(num), Money(money) //생성자

{

        Name = new char[strlen(name) + 1];

        strcpy(Name, name);

}


BankAccount::BankAccount(const BankAccount &copy) :AccountNumber(copy.AccountNumber), Money(copy.Money) //추가된 복사생성자(나름 간단), const 추가

{

        Name = new char[strlen(copy.Name) + 1];

        strcpy(Name, copy.Name);

}


int BankAccount::GetNumber() const //const 추가

{

        return AccountNumber;

}


void BankAccount::Deposit(int money)

{

        Money += money;

}


int BankAccount::Withdraw(int money)

{

        if (Money < money)

               return 0;

 

        Money -= money;

        return money;

}


void BankAccount::ShowAccountInfo() const //const 추가

{

        cout << "이름:" << Name << endl;

        cout << "계좌번호:" << AccountNumber << endl;

        cout << "잔고:" << Money << endl;

}


BankAccount::~BankAccount() //소멸자

{

        delete[]Name;

}

 

//컨트롤 클래스

class AccountHandler

{

private:

        BankAccount *Arr[10]; //계좌 포인터 배열

        int AccountNum; //계좌 개수

public:

        AccountHandler();

        ~AccountHandler();

        int Menu(void); //메뉴

        void MakeBankAccount(void); //계좌 개설

        void Deposit(int money); //입금

        void Withdraw(int money); //출금

        void ShowAccountInfo(void); //전체고객 잔액조회

};

 

AccountHandler::AccountHandler() :AccountNum(0)

{

}

 

AccountHandler::~AccountHandler()

{

        for (int i = 0; i < AccountNum; i++)

               delete Arr[i];

}

 

int AccountHandler::Menu(void)

{

        int sel;

        cout << "-----Menu-----" << endl;

        cout << "1.계좌개설" << endl << "2.입금" << endl << "3.출금" << endl << "4.계좌정보 전체 출력" << endl << "5.프로그램 종료" << endl;

        cout << "선택";

        cin >> sel;

        return sel;

}

 

void AccountHandler::MakeBankAccount()

{

        int accountNumber;

        char name[30];

        int money;

        cout << AccountNum + 1 << "번째 사람 정보 입력" << endl;

        cout << "계좌번호 입력:";

        cin >> accountNumber;

        cout << "이름 입력:";

        cin >> name;

        cout << "잔액 입력:";

        cin >> money;

        cout << endl;

 

        Arr[AccountNum++] = new BankAccount(accountNumber, name, money); //계좌개설 완료 다음 사람으로

}

 

void AccountHandler::Deposit(int money)

{

        int number;

        cout << "고객님의 계좌번호를 입력해주세요:";

        cin >> number;

        for (int i = 0; i <= AccountNum; i++)

        {

               if (Arr[i]->GetNumber() == number) //계좌번호가 같으면

               {

                       Arr[i]->Deposit(money);

                       cout << "입금이 완료되었습니다" << endl;

                       return;

               }

        }

        cout << "없는 계좌번호입니다" << endl;

}

 

void AccountHandler::Withdraw(int money)

{

        int number;

        cout << "고객님의 계좌번호를 입력해주세요:";

        cin >> number;

        for (int i = 0; i <= AccountNum; i++)

        {

               if (Arr[i]->GetNumber() == number) //계좌번호가 같으면

               {

                       if (Arr[i]->Withdraw(money) == 0)

                       {

                              cout << "잔액이 부족합니다" << endl;

                              return;

                       }

                       cout << "출금이 완료되었습니다" << endl;

                       return;

               }

        }

        cout << "없는 계좌번호입니다" << endl;

}

 

void AccountHandler::ShowAccountInfo(void)

{

        for (int i = 0; i < AccountNum; i++)

        {

               Arr[i]->ShowAccountInfo();

               cout << endl;

        }

}

 

int main(void)

{

        AccountHandler handler;

        int money;

        while (1)

        {

               int sel = handler.Menu();

               switch (sel)

               {

               case 1:

                       handler.MakeBankAccount();

                       break;

               case 2:

                       cout << "입금할 금액:";

                       cin >> money;

                       handler.Deposit(money);

                       break;

               case 3:

                       cout << "출금할 금액:";

                       cin >> money;

                       handler.Withdraw(money);

                       break;

               case 4:

                       handler.ShowAccountInfo();

                       break;

               case 5:

                       //이제 소멸자가 있으니 주석처리된 부분은 필요없다

                       /*

                       for (int i = 0; i < handler.AccountNum; i++) //포인터배열을 동적할당했으므로

                              delete Arr[i];

                              */

                       return 0;

               default:

                       cout << "잘못된 번호를 입력하셨습니다" << endl;

               }

        }

        return 0;

}


개발 환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 열혈 C++ 프로그래밍 윤성우 저

반응형