728x90
728x90

기능 제공의 핵심이 되는 컨트롤 클래스를 적용한다.


컨트롤 클래스는 프로그램 전체의 기능을 담당하는 기능적 성격이 강한 클래스이다.
컨트롤 클래스만 봐도 프로그램의 전체 기능과 흐름을 파악할 수 있다.

엔터티 클래스는 컨트롤 클래스가 아닌 대부분의 클래스다.
엔터티 클래스는 데이터적 성격이 강해 파일 및 데이터 베이스에 저장되는 데이터를 소유한다.
엔터티 클래스는 프로그램 상 관리되는 데이터의 종류를 파악하는 데 도움이 된다.
엔터티 클래스는 프로그램의 기능을 파악하는데 도움을 주지는 못한다.

 

 

과거 진행한 OOP 단계별 프로젝트

[윤성우 열혈 c++] OOP 단계별 프로젝트 01단계

[윤성우 열혈 c++] OOP 단계별 프로젝트 02단계

[윤성우 열혈 c++] OOP 단계별 프로젝트 03단계

[윤성우 열혈 c++] OOP 단계별 프로젝트 04단계

 

 

프로그램 설명

프로그램의 주요기능은 계좌개설, 입금, 출금, 계좌정보 전체 출력이다. 그리고 전역함수로 구현되어 있다.
객체지향 프로그래밍을 위해 여러 기능의 전역함수들을 하나의 컨트롤 클래스로 묶어서 구현한다. 
컨트롤 클래스는 프로그램의 기능적 측면을 담당하게 되어 본래 성격에도 부합한다. 구현 방법은...

1. AccountHandler라는 이름의 컨트롤 클래스를 정의하고 앞서 정의한 전역함수들을 이 클래스의 멤버함수로 포함시킨다.
2. Account 객체의 저장을 위해 선언한 배열과 변수도 이 클래스의 멤버에 포함시킨다.
3. AccountHandler 클래스 기반으로 프로그램이 실행되도록 main 함수를 변경한다.

 

* 흰트가 필요하면 EmployeeManager1.cpp 참고 (7장 예제로 이동)

 

 

 

 

코드
//은행 계좌 관리 프로그램 5
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>

using namespace std;

const int NAME_LEN = 20; //이름의길이

//1. 계좌개설
//2. 입금
//3. 출금
//4. 계좌번호 전체 출력
//5. 프로그램 종료
enum { MAKE = 1, DEPOSIT, WITHDRAW, INQUIRE, EXIT };

/********** 엔터티 클래스 Account **********/
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 반환 
    void Deposit(int money); // 입금    
    int WithDraw(int money);  // 출금
    void ShowAccInfo() const;  // 개인계좌조회

    ~Account(); // 소멸자
};

// 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;
}


/********** 컨트롤 클래스 AccountHandler **********/ 
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; //잔액조회

    ~AccountHandler(); //소멸자
};

//메뉴출력
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 id;
    char name[NAME_LEN];
    int balance;

    cout << "[계좌개설]" << endl;
    cout << "계좌ID:(숫자로 입력) "; cin >> id;
    cout << "이름: "; cin >> name;
    cout << "입금액: "; cin >> balance;
    cout << endl;

    accArr[accNum++] = new Account(id, balance, name);
}

//입금
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();
    }
}


/********** 메인 클래스 AccountHandler **********/
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