버전 0.2 에서 만들었던 은행계좌 관리 프로그램을 버전 0.3 으로 업그레이드 시켜보자.
깊은 복사를 진행하는 복사 생성자를 정의해보자.
실제 깊은 복사 생성자의 호출여부는 중요하지 않다. 클래스는 그 자체로 완성품이 되어야 하기 때문에, 당장 필요한 것만으로 채우지 않는다.
#include <iostream>
#include <cstring>
using namespace std;
const int NAME_LEN = 20;
void ShowMenu(void); // 메뉴출력
void MakeAccount(void); // 계좌개설을 위한 함수
void DepositMoney(void); // 입 금
void WithdrawMoney(void); // 출 금
void ShowAllAccInfo(void); // 잔액조회
enum { MAKE = 1, DEPOSIT, WITHDRAW, INQUIRE, EXIT };
class Account {
int accID; // 계좌번호
int balance; // 잔 액
char* cusName; // 고객이름
public:
Account(int ID, int money, char* name)
: accID(ID), balance(money) {
cusName = new char[strlen(name) + 1];
strcpy(cusName, name);
}
Account(const Account& copy) : accID(copy.accID), balance(copy.balance) {
cusName = new char[strlen(copy.cusName) + 1];
strcpy(cusName, copy.cusName);
}
int GetAccID() { return accID; }
void Deposit(const int money) {
balance += money;
}
int Withdraw(const int money) { // 출금액 반환, 부족 시 0
if (balance < money)
return 0;
balance -= money;
return money;
}
void ShowAccInfo() {
cout << "계좌ID: " << accID << endl;
cout << "이 름: " << cusName << endl;
cout << "잔 액: " << balance << endl;
}
~Account() {
delete[]cusName;
}
};
Account* accArr[100]; // Account 저장을 위한 배열
int accNum = 0; // 저장된 Account 수
int main(void) {
int choice;
while (1) {
ShowMenu();
cout << "선택: ";
cin >> choice;
cout << endl;
switch (choice) {
case MAKE:
MakeAccount();
break;
case DEPOSIT:
DepositMoney();
break;
case WITHDRAW:
WithdrawMoney();
break;
case INQUIRE:
ShowAllAccInfo();
break;
case EXIT:
cout << "프로그램을 종료합니다." << endl;
return 0;
default:
cout << "잘못된 입력입니다. 다시 입력해 주세요" << endl;
}
}
for (int i = 0; i < accNum; i++)
delete accArr[i];
return 0;
}
void ShowMenu(void) {
cout << "-----Menu------" << endl;
cout << "1. 계좌개설" << endl;
cout << "2. 입 금" << endl;
cout << "3. 출 금" << endl;
cout << "4. 계좌정보 전체 출력" << endl;
cout << "5. 프로그램 종료" << endl;
}
void 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 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 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 ShowAllAccInfo(void) {
for (int i = 0; i < accNum; i++)
{
accArr[i]->ShowAccInfo();
cout << endl;
}
}
0.2 버전과 다른점 : 아래 코드 부분이 추가됨
-> 단순히 복사만 하던 디폴트 복사 생성자를 대신해서 깊은 복사가 가능하게끔 하는 코드
Account(const Account& copy) : accID(copy.accID), balance(copy.balance) {
cusName = new char[strlen(copy.cusName) + 1];
strcpy(cusName, copy.cusName);
}