- 원래 미완성이였던 입출금, 거래내역 조회 부분까지 얼추 마무리가 끝났다.
- 코드를 전체적으로 돌려보며 예외를 확인하고 마지막 발표를 준비하고 있다.
- 깃허브를 활용해서 협업하니 훨씬 편하다.
- User.java
package vo;
public class User {
private String name; //유저 이름
private int stock; //잔고
private String accountNum; //계좌번호
private String bankName; //은행명
private String pwd; //비밀번호
private Account account;
public User(String name,int stock ,String accountNum, String bankName, String pwd) {
this.name = name;
this.stock = stock;
this.accountNum = accountNum;
this.bankName = bankName;
this.pwd = pwd;
}
public void setStock(int stock) {
this.stock = stock;
}
public void setName(String name) {
this.name = name;
}
public void setBankName(String bankName) {
this.bankName = bankName;
}
public String getName() {
return name;
}
public int getStock() {
return stock;
}
public String getAccountNum() {
return accountNum;
}
public String getBankName() {
return bankName;
}
public String getPwd() {
return pwd;
}
//입금
public void addStock(int money){
this.stock += money;
}
//출금
public void subtractStock(int money){
this.stock -= money;
}
}
- Account.java
package vo;
import java.time.LocalDateTime;
public class Account {
private String accountNum;
private LocalDateTime timeHistory;
private String plusOrMinus;
private int amount;
// 날짜/시간, 입출금 +-, 입력금액
public Account( String plusOrMinus,int amount,String accountNum) {
// this.timeHistory = timeHistory;
this.accountNum = accountNum;
this.plusOrMinus = plusOrMinus;
this.amount = amount;
}
public LocalDateTime getTimeHistory() { return timeHistory;}
public String getPlusOrMinus() {
return plusOrMinus;
}
public int getAmount() {
return amount;
}
public String getAccountNum() {
return accountNum;
}
public void setTimeHistory(LocalDateTime timeHistory) {
this.timeHistory = timeHistory;
}
}
- Bank.java
package service;
import vo.Account;
import vo.User;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class Bank {
private final static Bank bank = new Bank();
private List<User> userList = new ArrayList<>();
private List<Account> accountList = new ArrayList<>();
//Bank하나의 객체를 유지하기 위한 메서드
public static Bank getInstance(){
if(bank == null){
return new Bank();
}
return bank;
}
//유저의 정보를 저장하는 부분
public void addUser(User user){
System.out.println("은행 정보가 정상적으로 저장되었습니다.");
userList.add(user);
}
public void showAll(){
for(int i=0;i<userList.size();i++){
System.out.println("------------");
System.out.print(userList.get(i).getName()+"님 ");
System.out.println(userList.get(i).getAccountNum()+" ");
System.out.println(userList.get(i).getStock()+"원 ");
System.out.println(userList.get(i).getBankName()+" 은행");
}
}
public boolean checkToUsableBankNum(String bankNum){
if(userList.stream().anyMatch(s->s.getAccountNum().equals(bankNum))){
System.out.println("이미 등록된 계좌번호입니다!");
return false;
}
return true;
}
public boolean confirmAccountNum(String inputAccountNum){
if(userList.stream().anyMatch(s -> s.getAccountNum().equals(inputAccountNum))){
return true;
}
System.out.println("존재하지 않는 계좌번호입니다!");
return false;
}
public boolean confirmAccountName(String inputAccountName){
if(userList.stream().anyMatch(s -> s.getName().equals(inputAccountName))){
return true;
}
System.out.println("존재하지 않는 회원입니다!");
return false;
}
public boolean confirmAccountPwd(String inputAccountNum, String pwd){
Stream<User> userInfo = userList.stream().filter(s -> s.getAccountNum().equals(inputAccountNum));
if(userInfo.anyMatch(s -> s.getPwd().equals(pwd))){
return true;
}
System.out.println("계좌의 비밀번호가 틀립니다!");
return false;
}
public void updateUserName(String updateUserName,String inputAccountNum){
for(int i=0 ; i<userList.size();i++){
if(userList.get(i).getAccountNum().equals(inputAccountNum)){
String previousUserName = userList.get(i).getName();
userList.get(i).setName(updateUserName);
String presentUserName = userList.get(i).getName();
System.out.println(previousUserName+"님에서 "+presentUserName+"님으로 변경되었습니다!");
break;
}
}
}
public void updateBankName(String updateBankName,String inputAccountNum){
for(int i=0 ; i<userList.size();i++){
if(userList.get(i).getAccountNum().equals(inputAccountNum)){
String previousBankName = userList.get(i).getBankName();
userList.get(i).setBankName(updateBankName);
String presentBankName = userList.get(i).getBankName();
System.out.println(previousBankName+"은행에서 "+presentBankName+"은행으로 변경되었습니다!");
break;
}
}
}
public void deleteAccount(String inputAccountNum){
for(int i=0 ; i<userList.size();i++){
if(userList.get(i).getAccountNum().equals(inputAccountNum)){
String presentBankName = userList.get(i).getName();
userList.remove(i);
System.out.println(presentBankName+"님의 "+inputAccountNum+" 계좌가 삭제되었습니다!!");
break;
}
}
}
public void searchByUserName(String searchUserName){
Stream<User> searchUser = userList.stream().filter(s -> s.getName().equals(searchUserName));
searchUser.forEach(u -> System.out.println("--------\n"+u.getName()+" "+u.getAccountNum()+ " \n"+u.getStock()+"원 \n"+u.getBankName()+" 은행"));
}
public void searchByAccountNum(String searchAccountNum){
Stream<User> searchUser = userList.stream().filter(s -> s.getAccountNum().equals(searchAccountNum));
searchUser.forEach(u -> System.out.println("--------\n"+u.getName()+" "+u.getAccountNum()+ " \n"+u.getStock()+"원 \n"+u.getBankName()+" 은행"));
}
// 입출금 메서드
public void deposit(String AccountNum, int money) {
if (money == 0) {
System.out.println("금액을 다시 입력해주세요");
}
for (int i = 0; i < userList.size(); i++) {
if (userList.get(i).getAccountNum().equals(AccountNum)) {
userList.get(i).addStock(money);
break;
}
}
}
public void withdraw(String AccountNum, int money) {
for (int i = 0; i < userList.size(); i++) {
if (userList.get(i).getAccountNum().equals(AccountNum)) {
if(userList.get(i).getStock() <= money) {
System.out.println("잔고가 부족합니다");
} else if( userList.get(i).getStock() >= money) {
userList.get(i).subtractStock(money);
System.out.println("출금되었습니다.");
}
break;
}
}
}
//잔고 확인
public void searchAccountStock(String searchAccountNum) {
Stream<User> searchUser = userList.stream().filter(s -> s.getAccountNum().equals(searchAccountNum));
searchUser.forEach(u -> System.out.println("--------\n" + u.getBankName() + "은행 " + u.getAccountNum() + " \n" + "남은 잔고: " + u.getStock() + "원 \n"));
}
public void searchByUserNameList(String searchUserName){
Stream<User> searchUser = userList.stream().filter(s -> s.getName().equals(searchUserName));
searchUser.forEach(u -> System.out.println("--------\n"+u.getName()+" "+u.getBankName()+"은행 "+u.getAccountNum()+ " \n"));
}
public void addDepositOrWithdrawList(Account account){
LocalDateTime localDateTime = LocalDateTime.now();
account.setTimeHistory(localDateTime);
accountList.add(account);
}
public boolean showAccountList(String userName,String accountNum){
Stream<Account> accountListUser = accountList.stream().filter(s -> s.getAccountNum().equals(accountNum));
if(!accountList.stream().anyMatch(s -> s.getAccountNum().equals(accountNum))){
System.out.println(accountNum+" 계좌의 입출금 내역이 없습니다!");
return false;
}
System.out.println("=== "+userName+"님의 " +accountNum+" 계좌 입출금 거래내역 ===");
accountListUser.forEach(s -> System.out.println(s.getPlusOrMinus()+" "+s.getAmount()+"원 "+s.getTimeHistory()));
System.out.println("==========================");
return true;
}
}
- App.java
import service.Bank;
import vo.Account;
import vo.User;
import java.util.Scanner;
import java.util.regex.Pattern;
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
// main 화면, 각 클래스와 관련된 내용으로 연결되고 이후 접속 시 관련 메뉴를 한 번 더 볼 수 있도록 설정
System.out.println("=== BankSystem에 오신 것을 환영합니다 ===");
System.out.println("원하시는 메뉴에 해당하는 번호를 입력하세요.");
System.out.println("1. 은행 관리 2. 거래내역 및 입출금 3. 종료");
int select = sc.nextInt();
if (select == 3) {
System.out.println("안녕히 가십시오");
break;
}
switch (select) {
case 1:
bankManager();
break;
case 2:
moneyList();
break;
default:
System.out.println("다시 입력해 주세요.");
break;
}
}
}
public static void bankManager() {
Bank bank = Bank.getInstance();
Scanner sc = new Scanner(System.in);
while (true) {
// 은행 관리자 화면
System.out.println("=== 은행 관리 ===");
System.out.println("원하시는 메뉴에 해당하는 번호를 입력하세요.");
System.out.println("1. 계좌 등록 2. 등록계좌 수정/삭제 3. 계좌 조회(소유자/계좌번호/전체) 4. 이전");
int select = sc.nextInt();
if (select == 4) {
break;
}
switch (select) {
case 1:
System.out.println("=== 계좌 등록 ===");
System.out.print("소유주 : ");
String name = sc.next();
String pattern = "[0-9,\\-]{3,6}\\-[0-9,\\-]{2,6}\\-[0-9,\\-]";
System.out.print("계좌번호( ex) xxx-xxxxxx-x ) : ");
String accountNum = sc.next();
if (!Pattern.matches(pattern, accountNum)) {
System.out.println("계좌번호 형식이 틀렸습니다!");
return;
}
if (!bank.checkToUsableBankNum(accountNum)) {
return;
}
System.out.print("계좌 비밀번호 설정 :");
String pwd = sc.next();
System.out.print("은행명 :");
String bankName = sc.next();
User user = new User(name, 0, accountNum, bankName, pwd);
bank.addUser(user);
break;
case 2:
System.out.println("=== 등록계좌 수정 및 삭제 ===");
System.out.println("1. 수정 2. 삭제");
int num2 = sc.nextInt();
if (num2 == 1) {
// 수정 메서드 호출
System.out.print("수정할 계좌번호를 입력하세요 :");
String updateAccountNum = sc.next();
// 입력한 계좌번호가 DB에 있는지 확인
if (!bank.confirmAccountNum(updateAccountNum)) {
return;
}
System.out.print("계좌 비밀번호를 입력하세요 :");
String updatePwd = sc.next();
// 입력한 계좌의 비밀번호가 맞는지 확인
if (!bank.confirmAccountPwd(updateAccountNum, updatePwd)) {
return;
}
System.out.print("수정할 정보를 선택하세요!");
System.out.println("1.소유주명, 2.은행");
int updateContentNum = sc.nextInt();
if (updateContentNum == 1) {
// 소유주명 바꾸기
System.out.print("변경할 소유주명 :");
String updateUserName = sc.next();
bank.updateUserName(updateUserName, updateAccountNum);
} else {
// 은행명 바꾸기
System.out.print("변경할 은행명 : ");
String updateBankName = sc.next();
bank.updateBankName(updateBankName, updateAccountNum);
}
} else {
// 삭제 메서드 호출
System.out.print("삭제할 계좌번호를 입력하세요 :");
String deleteAccountNum = sc.next();
// 입력한 계좌번호가 DB에 있는지 확인
if (!bank.confirmAccountNum(deleteAccountNum)) {
return;
}
System.out.print("계좌 비밀번호를 입력하세요 :");
String deletePwd = sc.next();
// 입력한 계좌의 비밀번호가 맞는지 확인
if (!bank.confirmAccountPwd(deleteAccountNum, deletePwd)) {
return;
}
bank.deleteAccount(deleteAccountNum);
}
break;
case 3:
System.out.println("=== 등록계좌 조회 ===");
System.out.println("1. 이름으로 조회 2. 계좌번호로 조회 3. 전체 조회");
int num3 = sc.nextInt();
if (num3 == 1) {
// 이름 조회 메서드 호출
System.out.print("조회하실 성함을 입력하세요 :");
String searchName = sc.next();
if (!bank.confirmAccountName(searchName)) {
return;
}
bank.searchByUserName(searchName);
} else if (num3 == 2) {
// 계좌번호 조희 메서드 호출
System.out.print("조회하실 계좌번호를 입력하세요 :");
String searchAccountNum = sc.next();
//search
if (!bank.confirmAccountNum(searchAccountNum)) {
return;
}
bank.searchByAccountNum(searchAccountNum);
} else {
// 전체 조회 메서드 호출
bank.showAll();
}
break;
default:
System.out.println("다시 입력해 주세요.");
break;
}
}
}
public static void moneyList() {
Scanner sc = new Scanner(System.in);
Bank bank = Bank.getInstance();
// String accNum = 계좌번호 호출
while (true) {
// 입출금내역 관련 화면
System.out.println("=== 거래 내역 및 입출금 ===");
System.out.println("원하시는 메뉴에 해당하는 번호를 입력하세요.");
System.out.println("1. 잔고 확인 2. 거래 내역 조회 3. 입금/출금 4. 이전");
int accountMenu = sc.nextInt();
if (accountMenu == 4) {
break;
}
switch (accountMenu) {
case 1:
// 잔고확인 메서드
System.out.println("=== 계좌잔고 조회 ===");
System.out.print("이름을 입력하세요 : "); //이름을 입력하세요
String searchNameSt = sc.next();
System.out.println("계좌목록들 입니다");
if(!bank.confirmAccountName(searchNameSt)){
return;
}
bank.searchByUserNameList(searchNameSt);
System.out.print("조회하실 계좌번호를 입력하세요 :");
String searchAccountNum = sc.next();
//search
if (!bank.confirmAccountNum(searchAccountNum)) {
return;
}
System.out.print("계좌 비밀번호를 입력하세요 :");
String searchPwd = sc.next();
// 입력한 계좌의 비밀번호가 맞는지 확인
if (!bank.confirmAccountPwd(searchAccountNum, searchPwd)) {
return;
}
bank.searchAccountStock(searchAccountNum);
break;
case 2:
System.out.println("=== 거래내역 조회 ===");
System.out.print("이름을 입력하세요 : ");
String accountName = sc.next();
if (!bank.confirmAccountName(accountName)) {
return;
}
System.out.print("계좌번호를 입력하세요 : ");
String AccountNumCaseTwo = sc.next();
if (!bank.confirmAccountNum(AccountNumCaseTwo)) {
return;
}
System.out.print("계좌비밀번호를 입력하세요 : ");
String serchPwd = sc.next();
if (!bank.confirmAccountPwd(AccountNumCaseTwo, serchPwd)) {
return;
}
if(!bank.showAccountList(accountName,AccountNumCaseTwo)){
return;
}
break;
case 3:
System.out.println("=== 입출금 ===");
System.out.println("1. 입금 2. 출금");
int num = sc.nextInt();
if (num == 1) {
// return Bank.입금메서드 호출
System.out.print("계좌번호를 입력하세요 : ");
String AccountNum = sc.next();
//search 계좌번호
if (!bank.confirmAccountNum(AccountNum)) {
return;
}
System.out.print("계좌 비밀번호를 입력하세요 :");
String updatePwd = sc.next();
// 입력한 계좌의 비밀번호가 맞는지 확인
if (!bank.confirmAccountPwd(AccountNum, updatePwd)) {
return;
}
System.out.print("입금할 금액을 입력하세요 : ");
int money = sc.nextInt();
bank.deposit(AccountNum,money);
System.out.println("입금되었습니다.");
Account account = new Account("입금",money,AccountNum);
bank.addDepositOrWithdrawList(account);
} else if(num == 2){
// return Bank.출금메서드 호출
System.out.print("계좌번호를 입력하세요 : ");
String AccountNum = sc.next();
//search 계좌번호
if (!bank.confirmAccountNum(AccountNum)) {
return;
}
System.out.print("계좌 비밀번호를 입력하세요 :");
String updatePwd = sc.next();
// 입력한 계좌의 비밀번호가 맞는지 확인
if (!bank.confirmAccountPwd(AccountNum, updatePwd)) {
return;
}
System.out.print("출금할 금액을 입력하세요 : ");
int money = sc.nextInt();
bank.withdraw(AccountNum,money);
Account account = new Account("출금",money,AccountNum);
bank.addDepositOrWithdrawList(account);
}else{
System.out.println("잘못된 번호입니다!!");
return;
}
break;
default:
System.out.println("다시 입력해 주세요.");
break;
}
}
}
}
1) Main의 코드가 너무 길다. -> 중복되는 부분을 함수로 빼고, 필요없는 구문을 지워서 코드를 더 줄일 수 있을 것 같다.
2) 다른 코드도 마찬가지로 은근히 중복이 발생한다. -> 함수로 빼고 그 기능을 가져다가 쓰자!
3) 가독성이 떨어진다. -> 흐름대로 작업하다보니 가독성을 신경쓰지 못한 것 같다.
-> 변수명이나 함수명도 조금 더 알기 쉽게 작업해야 될 필요성이 분명하다.
4) 그래도 구현은 잘된다. -> 지금의 Level에서는 코드를 효율적으로 짜는 것도 물론 중요 하지만, 동작 구현을 1순위로 작업하고, 그 다음에 효율성을 따져보도록 하자.
5) 실제 DB를 활용하는 프로젝트에 들어가면 더 재밌을 것 같다.
6) 일단 끝까지 해냈다는거에 만족하고 재밌게 코딩했던 것 같다.