이번 글은 C++의 클래스와 배운것들을 종합하여 이해하기 위해 코드를 보며 계좌관리 프로그램이 어떻게 돌아가는지 확인해보자
이 코드의 출처는 https://koocci.github.io 이다.
약간의 변수이름 변경과 주석을 통해 우리가 클래스를 통해 어떻게 프로그램이 흘러가고 생성자 및 소멸자 그리고 데이터의 이동과 기능이 동작하는 방식을 이해하는것에 중점을 두면 좋을 것 같다.
생성자와 소멸자 맴버함수에 출력문을 만들어 확인한다면 어떻게 동작이 흘러가는지 알 수 있는 좋은 방법이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | #include<iostream> #include<string.h> #include<string> #include<stdlib.h> using namespace std; const int NAME_LEN = 20; enum { MAKE = 1, DEPOSIT, WITHDRAW, INQUIRE, EXIT }; class Account {// 정적으로 기능에서 이루어진 동작들의 데이터를 처리함 private: int ID; int bal; char * cusname; public: Account(int id, int val, char * name); // 생성자 Account(const Account &ref); // 깊은 복사를 위한 (디폴트) 복사생성자 int getid() const; void deposit(int money); int withdraw(int money); void showinfo(); ~Account(); }; Account::Account(int id, int val, char * name) : ID(id), bal(val) { cusname = new char[strlen(name) + 1]; strcpy(cusname, name); } Account::Account(const Account &ref) : ID(ref.ID), bal(ref.bal) { //깊은 복사를 진행하는 복사생성자 cusname = new char[strlen(ref.cusname) + 1]; strcpy(cusname, ref.cusname); } int Account::getid() const {// private 맴버변수인 고객의 ID를 return return ID; }; void Account::deposit(int money) {// 예금 bal += money; } int Account::withdraw(int money) {// 인출 if (bal < money) { return 0; } bal = bal - money; return money; } void Account::showinfo() { cout << "ID : " << ID << endl; cout << "bal : " << bal << endl; cout << "name : " << cusname << endl; } Account ::~Account() {// 동적 메모리 헤제 delete[] cusname; } class AccountHandler {// 기능을 담당하기 위한 클래스, 모든 기능적 측면을 다룸 private: Account* accArr[100]; // Account객체의 저장을 위한 맴버 int accNum; public: AccountHandler(); void showmenu() const; void makeaccount(); void depositmo(); void withdrawmo(); void showallinfo() const; ~AccountHandler(); }; void AccountHandler::showmenu() const { cout << " ===== MENU ===== " << endl; cout << "1. 계좌개설 " << endl; cout << "2. 입금 " << endl; cout << "3. 출금 " << endl; cout << "4. 계좌정보 전체 출력 " << endl; cout << "5. 종료 " << endl; } void AccountHandler::makeaccount() { 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); // Account객체를 생성, accArr배열은 그 자료형이 Account객체를 저장하는 자료형 // 입력값들은 Account객체로 생성되어 입력값이 Account의 생성자로 들어간다. } void AccountHandler::depositmo() { int money; int id; cout << "[입 금]" << endl; cout << "계좌ID : "; cin >> id; cout << "입금액 : "; cin >> money; for (int i = 0; i < accNum; i++) { if (accArr[i]->getid() == id) {// 입금하는 이름이 같을때 accArr[i]->deposit(money); cout << "입금완료" << endl; return; } } cout << "유효하지 않은 ID 입니다." << endl << endl; } void AccountHandler::withdrawmo() { int money; int id; cout << "[출 금]" << endl; cout << "계좌ID : "; cin >> id; cout << "출금액 : "; cin >> money; for (int i = 0; i < accNum; i++) { if (accArr[i]->getid() == id) {// 입금하는 이름이 같을 때 if (accArr[i]->withdraw(money) == 0) {// 잔고가 없을때 cout << "잔액부족" << endl << endl; return; } accArr[i]->withdraw(money); cout << "출금완료" << endl; return; } } cout << "유효하지 않은 ID 입니다." << endl << endl; } AccountHandler::AccountHandler() : accNum(0) {} void AccountHandler::showallinfo() const { for (int i = 0; i < accNum; i++) { accArr[i]->showinfo(); cout << endl; } } AccountHandler :: ~AccountHandler() { for (int i = 0; i < accNum; i++) { delete accArr[i]; } } int main() { AccountHandler man; // 핸들러 객체생성 int choice; while (1) { man.showmenu(); cin >> choice; cout << endl; switch (choice) { case MAKE: man.makeaccount(); break; case DEPOSIT: man.depositmo(); break; case WITHDRAW: man.withdrawmo(); break; case INQUIRE: man.showallinfo(); break; case EXIT: return 0; default: break; } } return 0; } |
'C , C++, C#' 카테고리의 다른 글
C++ 다형성,상속 간단정리 (0) | 2019.02.26 |
---|---|
[자료구조] 링크드 리스트(C++) (0) | 2019.02.20 |
[자료구조]링크드리스트 삽입 삭제 (C언어) (0) | 2019.02.20 |
[자료구조] C/C++ 단일 링크드리스트 (0) | 2019.02.19 |
C++ 복습 : const static (0) | 2019.02.18 |