[열혈 C++] OOP 단계별 프로젝트 02단계 : 클래스
🔭프로그램 설명
-
구조체 Account를 클래스로 변경해보고자 한다.
-
생성자와 소멸자, 캡슐화와 정보은닉을 생각하며 구현하는 것이 목표이다.
-
제약
- 고객의 이름을 동적할당 형태로 구현한다
- 객체 포인터 배열을 선언하여 객체를 저장한다.
🖥️구현
- 본인은 교재와 달리 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;
}
🚀오류
- “정의되지 않은 Account 형식을 사용합니다”
-
전방 선언과 관련된 문제였다.
BankSystem
클래스에서Account
클래스 객체를 포인터 배열로 가지고 있는데,BankSystem
클래스 앞에Account
클래스를 선언만 해주고, 포인터 배열로 만들어서 멤버함수를 사용한 것이 문제였다. -
메모리를 할당해야 하는데, 얼마만큼의 메모리를 할당해야 하는지 크기를 알 수 없어서 오류가 발생한다.
-
간단하게 클래스 위치만 수정하면 된다.
Account
를BankSystem
앞으로 빼주니 해결됐다. 이래서 헤더파일 cpp 파일 나눠서 코드를 짜는 것이 좋은 것 같다.
-
- “식이 수정할 수 있는 lvalue 여야 합니다”
- 내가 바보였다. 멤버함수에 접근하여 얻은 값에
+=
오퍼레이터를 사용했다.arr[i]->getBalance += money; // 이것은 1 += 2; 와 같은 구문이다
이런식으로. 착각해서 일으킨 오류였다.
창피하다
- 내가 바보였다. 멤버함수에 접근하여 얻은 값에