3 minute read

🔭프로그램 설명

  • 구조체 Account를 클래스로 변경해보고자 한다.

  • 생성자와 소멸자, 캡슐화와 정보은닉을 생각하며 구현하는 것이 목표이다.

  • 제약

    1. 고객의 이름을 동적할당 형태로 구현한다
    2. 객체 포인터 배열을 선언하여 객체를 저장한다.

🖥️구현

  • 본인은 교재와 달리 Account클래스와 계좌를 관리하는 BankSystem클래스 두개를 만들었다.
  • Account클래스는 말그대로 계좌 하나만 담당하도록 했고, 은행 역할은 BankSystem클래스에 포함시켰다.

  • 생각과 달리 Account의 구조체가 그냥 클래스로 바뀐것과 똑같은 것 같고, 굳이 Account 클래스를 따로 만들 필요가 있나 싶은 느낌이 들었다. 그러나 계좌가 하나만 존재할 것도 아니고 한번에 많은 계좌들을 관리하는 곳은 은행이므로, Handler로써 나중에라도 필요할 것 같아서 만들었다.
/*
 * Banking System Ver 0.2
 * author : YEJIN LEE
 * contents : Account 클래스
 */
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

enum { DEPOSIT = 1, WITHDRAW, CREATE, INQUIRY, EXIT };
const int NAME_LEN = 10;



///////////////////// 계좌 /////////////////////////

class Account
{
public:
	Account(int id, char* name, int balance);
	~Account();

private:
	int m_Id;			// 계좌번호
	char* m_cpName;		// 이름
	int m_Balance;		// 잔고

public:
	int getID();
	int getBalance();
	char* getName();
	void changeBalance(int money);
};


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()
{
}

int Account::getID() {
	return m_Id;
}

int Account::getBalance() const{
	return m_Balance;
}

char* Account::getName() const{
	return m_cpName;
}

void Account::changeBalance(int money) {
	m_Balance = money;
}




//////////////////// 은행 //////////////////////

class BankSystem
{
public:
	BankSystem();
	~BankSystem();

private:
	int m_NumOfAcc;				// 계좌 개수
	Account * m_pAccs[50];		// 계좌 배열

public:
	void AnnounceSys();			// 시스템 안내
	void CreateAccount();		// 계좌 개설
	void DepositMoney();		// 입금
	void WithdrawMoney();		// 출금
	void InquiryAcc();			// 잔액조회

};

BankSystem::BankSystem() : m_NumOfAcc(0)
{
}

BankSystem::~BankSystem()
{
	delete[]m_pAccs;
}

void BankSystem::AnnounceSys() {

	cout << "----- Menu -----" << endl;
	cout << "1. 입    금" << endl;
	cout << "2. 출    금" << endl;
	cout << "3. 개    설" << endl;
	cout << "4. 계좌정보" << endl;
	cout << "5. 종    료" << endl;
    
}

void BankSystem::CreateAccount() {

	int id;	
	char name[NAME_LEN]; 
	int money;

	cout << "계좌번호 : " << endl; cin >> id;
	cout << "이    름 : " << endl; cin >> name;
	cout << "잔    액 : " << endl; cin >> money;

	m_pAccs[m_NumOfAcc++] = new Account(id, name, money);
	
}

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]->getBalance();
			retMoney += money;
			m_pAccs[i]->changeBalance(retMoney);

			cout << "잔액 : " << m_pAccs[i]->getBalance() << 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]->getBalance();
				retMoney  -= money;

			if (m_pAccs[i]->getBalance() < 0) {
				cout << "잔액이 부족합니다" << endl << endl;
				retMoney = m_pAccs[i]->getBalance();
				retMoney  += money;
				m_pAccs[i]->changeBalance(retMoney);
				return;		
			}

			m_pAccs[i]->changeBalance(retMoney);
			cout << "잔액 : " << m_pAccs[i]->getBalance() << 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;
			cout << "계좌번호 : " << id << endl;
			cout << "이름 : " << m_pAccs[i]->getName() << endl;
			cout << "잔고 : " << m_pAccs[i]->getBalance() << endl << endl;

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

🚀오류

  1. “정의되지 않은 Account 형식을 사용합니다”
    • 전방 선언과 관련된 문제였다. BankSystem 클래스에서 Account 클래스 객체를 포인터 배열로 가지고 있는데, BankSystem 클래스 앞에 Account 클래스를 선언만 해주고, 포인터 배열로 만들어서 멤버함수를 사용한 것이 문제였다.

    • 메모리를 할당해야 하는데, 얼마만큼의 메모리를 할당해야 하는지 크기를 알 수 없어서 오류가 발생한다.

    • 간단하게 클래스 위치만 수정하면 된다. AccountBankSystem 앞으로 빼주니 해결됐다. 이래서 헤더파일 cpp 파일 나눠서 코드를 짜는 것이 좋은 것 같다.

  2. “식이 수정할 수 있는 lvalue 여야 합니다”
    • 내가 바보였다. 멤버함수에 접근하여 얻은 값에 += 오퍼레이터를 사용했다.
         arr[i]->getBalance += money;
         // 이것은 1 += 2; 와 같은 구문이다
      

      이런식으로. 착각해서 일으킨 오류였다. 창피하다

Tags: ,

Categories:

Updated: