c++/c 언어 기반의 c++ 1

01-06 [C++] OOP 프로젝트 Bank Account

TIM_0529 2022. 12. 28. 09:06
반응형

언리얼을 좀 더 심도있게 사용 위해 C++를 다시 공부하는 김에 

언리얼 C++ 스타일로 프로그래밍을 해보았다.

 

우선 필요한 클래스, 함수, 변수를 담고 있는 헤더 파일이다.

#pragma once
class UserInforamtion {

public:
	int money;												// 고객 금액
	unsigned int account_id;								// 고객 아이디 -> 고객 식별을 위해 사용
	char client_name[50];									// 고객 이름 저장

public:

	UserInforamtion();										// 생성자 -> 데이터 초기화 근데 지금은 없어도 될 듯 
	void MakeAccount(UserInforamtion *user,int size);		// 계좌계설
	void Deposit(UserInforamtion* user,int size);			// 출금
	void Withdraw(UserInforamtion* user, int size);			// 입금

	~UserInforamtion();										// 소멸자. 삭제도 해 줘야 GC 가 발생하지 않는다.
};

void MenuScreen();											// 메뉴 화면
void PrintAllAccountIfo(UserInforamtion *userinfo,int size);// 모든 고객 정보 확인하기

 그 다음 헤더파일에서 함수와 변수들에 기능 구현을 담당하는 cpp 파일이다.

#include <iostream>
#include "BankSystem.h"
#include <Windows.h>
using namespace std;

UserInforamtion::UserInforamtion(){
		money = 0;
		account_id = 0;
}

void MenuScreen() {
	int choice = 0;
	cout << " ----- Menu ----- " << endl;
	cout << "1. Make Account" << endl;
	cout << "2. Deposit " << endl;
	cout << "3. Withdraw " << endl;
	cout << "4. Print Entire Account Information " << endl;
	cout << "5. Exit " << endl;
	cout << "Insert: ";
}


// UserInformation 클래스로 만들어진 배열 변수에 주소를 갖고온다. 
// 주소와 사이즈를 직접 받아옴으로써 배열에 값에 직접 접근할 수 있음.
// 해당 인덱스에 클래스 변수에 데이터를 담아줌
void UserInforamtion::MakeAccount(UserInforamtion *user,int index){
	int money=0;
	cout << "[ Make Account]" << endl;
	cout << "Accout ID: ";
	cin >>  user[index].account_id;
	cout << "Name : ";
	cin >> user[index].client_name;
	cout << "Deposit Money : ";
	cin >> user[index].money;
}

// 직접 접근을 통해서 값 변경 가능 MakeMoney 함수와 기법 동일함
void UserInforamtion::Deposit(UserInforamtion* user, int size) {
	int account_ID=0;
	int deposit_Moeny;
	int user_input;
	cout << "[Deposit]" << endl;
	cout << "Account ID : ";
	cin >> account_ID;

	// 만들어진 고객 수 만큼 반복하여 동일안 아이디가 있는지 검색
	for (int i = 0; i < size; i++)
	{
		// 동일한 아이디가 있을 시 출금 진행
		if (user[i].account_id == account_ID) {
			cout << "Deposit Money : ";
			cin >> deposit_Moeny;
			user[i].money += deposit_Moeny;
			cout << "Deposit Success" << endl;
			cout << "Go Main Menu....";
			cin >> user_input;
			system("cls");
		}
		// 동일한 아이디가 없을 시 메인 메뉴로 이동
		else {
			cout << "Can't Find Your ID...." << endl;
			cout << "Go Main Menu....";
			cin >> user_input;
			system("cls");
		}
	}
}

// Deposit 과 기능이 비슷한데 뭔가 좀 더 간결하게 바꿀 방법이 있을것 같다.
void UserInforamtion::Withdraw(UserInforamtion* user, int size) {
	int account_ID = 0;
	int withdraw_Moeny;
	int user_input;
	cout << "[Withdraw]" << endl;

	cout << "Account ID : ";
	cin >> account_ID;
	for (int i = 0; i < size; i++)
	{
		if (user[i].account_id == account_ID) {
			cout << "Withdraw Money : ";
			cin >> withdraw_Moeny;
			user[i].money -= withdraw_Moeny;
			cout << "Withdraw Success" << endl;
			cout << "Go Main Menu....";
			cin >> user_input;
			system("cls");
		}
		else {
			cout << "Can't Find Your ID...." << endl;
			cout << "Go Main Menu....";
			cin >> user_input;
			system("cls");
		}
	}
}


// 고객 수 만큼 반복하여 해당 인덱스에 있는 클래스 변수에서 값 갖고 나옴
// 프로퍼티를 이용해서 캡슐화에 이점인 암호화를 더욱 부각했어야 한다. 변수가 public 으로 선언되면 안됨
void PrintAllAccountIfo(UserInforamtion *userinfo,int size) {
	cout << "[PrintAllAccountIfo]" << endl;
	size++;
	system("cls");
	cout << "================================================================" << endl;
	for (int i = 0; i < size; i++)
	{
		cout << endl;
		cout<<i+1<<" 번째 고객: " <<userinfo[i].account_id << endl;
		cout<<i+1<<" 번째 고객: " <<userinfo[i].client_name<< endl;
		cout<<i+1<<" 번째 고객: " <<userinfo[i].money << endl;
		cout << endl;
		cout << "================================================================" << endl;
	}
	cout << endl;
	cout << endl;
	cout << endl;

	cout << "Go to Menu....";
	cin >> size;
	system("cls");
}

다음은 만들어진 함수와 변수 그리고 클래스를 조합하여 실질적인 프로그램이 되도록 조합한 main.cpp 코드이다.

 

#include <iostream>
#include "BankSystem.h"
using namespace std;
int main()
{

	int user_choice = 0;							// switch 문에서 유저 입력을 위해 선언
	int accounter_number = 0;						// 고객수 전달해 줄 변수

	UserInforamtion client[50];						// 유저 정보에 필요한 클래스를 갖고 있는 변수 배열, 최대 50개

	while (user_choice!=5)							// 5 입력시 종료,
	{
		MenuScreen();
		cin >> user_choice;
		switch (user_choice)						// switch 문으로 가독성 증가 하지만 if 문보다 다소 느릴 수 있음
		{
		case 1:
			client->MakeAccount(client, accounter_number);		// client 를 넘겨주면서 배열에 처음 요소에 주소 즉 배열을 통채로 넘겨준다.
			accounter_number++;									// 새로 만들었을 때만 고객수 증가
			break;
		case 2:
			client->Deposit(client, accounter_number);	
			break;
		case 3:
			client->Withdraw(client, accounter_number);
			break;
		case 4:
			PrintAllAccountIfo(client, accounter_number-1);		// 계좌 개설후 수가 증가하므로 -1 해서 널값 삭제
			break;
		}
	}
}

새로 알게 된 점:

클래스를 배열에 담아 사용하는 client 변수를 보면 

client-> 을 통해 데이터를 불러오는 방법과  client[] 을 통해 불러오는 방법이 있다.

배열에 간접 참조와 직접 참조를 하는 것인데. 포인터 부분이 약하다 보니 잘 사용하지 못했었다. 검색을 통해서 하는 법을 알게 되었고 사용해 보니 생각보다 사용법이 간단했고 코드도 더 간결해 졌다.

나중에 여기에 대해서 또 정리해서 블로깅을 해 야겠다.

 

부족한 점:

코드를 좀더 간결하게 만들수 있을것 같다. 특히 Withdraw 와 Deposit 함수에 차이는 돈을 넣느냐 빼느냐 여서 + 와 - 차이 밖에 없다 매개 변수에서 bool 변수를 사용해서 조건을 걸어서 넣느냐 빼느냐로 분리 한다면 두개의 함수를 하나로 줄일수 있어서 더 간단해 질 것 같았지만, 정의가 모호해 질 수 있어서 이번에는 따로 나눴는데 역시 좀 아쉬웠다.

 

캡슐화가 잘 이루어지지 않았다. 가장 큰 아쉬운 점인데 프로퍼티를 사용해 Getter() Setter() 를 통해서 변수르 조작했어야 하는데 public 으로 열어버려서 다른 곳에서도 접근이 가능하다

캡슐화에 암호화특징이 지켜지지 않았다.

반응형