언리얼을 좀 더 심도있게 사용 위해 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 으로 열어버려서 다른 곳에서도 접근이 가능하다
캡슐화에 암호화특징이 지켜지지 않았다.
'c++ > c 언어 기반의 c++ 1' 카테고리의 다른 글
01-05 [C++] 이름공간 (namespace) 이해하기 (0) | 2022.12.28 |
---|---|
01-04 [C++]인라인 (Inline) 함수 (2) | 2022.12.28 |
01-03 [C++] 매개변수의 디폴트 값 (Default Value) (0) | 2022.12.27 |
01-02 [C++] 함수 오버로딩 (Function Overloading) (2) | 2022.12.27 |
01-01 [c++] 입 출력 연산자 (0) | 2022.12.27 |