상세 컨텐츠

본문 제목

JAVA - ATM(배열, 클래스 분리, MVC)

카테고리 없음

by RosetteNebula 2023. 2. 14. 11:15

본문

 

단순히 클래스 배열과 MVC로 클래스만 분리한 코드 입니다

 

 

class Main

import Controller.ATM_Controller;

public class main {

	public static void main(String[] args) {
		new ATM_Controller();
	}
}

 

class ATM_Controller

package Controller;

import java.util.*;

import Model.AccountDAO;
import Model.MemberDAO;
import View.ATM_Menu;

public class ATM_Controller {
	Scanner sc;
	MemberDAO memDAO;
	AccountDAO accDAO;
	ATM_Menu menu;
	
	public ATM_Controller() {
		init();
		run();
	}
	
	void init() {
		sc = new Scanner(System.in);
		memDAO = new MemberDAO();
		accDAO = new AccountDAO();
		menu = new ATM_Menu();
	}
	
	/* 메뉴출력 */
	void printMenu() {
		menu.getMenu(memDAO.getMemberCount(), memDAO.getLogintID(), memDAO, accDAO);
	}
	
	/* 회원가입 */
	void joinMember() {
		System.out.print("[가입] ID 입력 : ");
		String id = sc.nextLine();
		
		if(id.equals("")) {	//공백 입력 방지
			System.err.println("[오류] 최소 한 글자 이상 입력해 주세요!!");
		}
		else if(memDAO.isValidId(id)) {
			System.out.print("[가입] PW 입력 : ");
			String pw = sc.nextLine();
			
			if(pw.equals("")) {	//공백 입력 방지
				System.err.println("[오류] 최소 한 글자 이상 입력해 주세요!!");
			}
			else {
				System.out.print("[가입] 이름 입력 : ");
				String name = sc.nextLine();
				
				memDAO.addMember(id, name);
				accDAO.addAccount(pw, id, memDAO.getMemberCount()-1);
				
				System.out.println("[메시지] 가입을 축하합니다.");
			}
		}
		else {
			System.err.println("ID가 중복됩니다.");
		}
	}
	
	/* 로그인 */
	void loginMember() {
		System.out.print("[로그인] ID 입력 : ");
		String id = sc.nextLine();
		
		if(!memDAO.isValidId(id)) {
			System.out.print("[로그인] PW 입력 : ");
			String pw = sc.nextLine();
			
			if(accDAO.isValidPw(id, pw)) {
				memDAO.setLoginID(id);
				System.out.println("[메시지] " + id + "님 환영합니다.");
			}
			else {
				System.err.println("[오류] PW가 일치하지 않습니다.");
			}
		}
		else {
			System.err.println("[오류] ID가 일치하지 않습니다.");
		}
	}
	
	/* 입금 */
	void deposit() {
		System.out.print("[입금] 입금할 금액을 입력하세요 : ");
		int money = sc.nextInt();
		
		if(money < 1000) {
			System.err.println("[오류] 1000원 이상 금액입력");
		}
		else {
			accDAO.setMoney(memDAO.getLogintID(), money);
			System.out.println("[메시지] 입금을 완료하였습니다.");
		}
	}
	
	/* 이체 */
	void transfer() {
		System.out.print("[이체] 계좌번호를 입력하세요 : ");
		String accNum = sc.nextLine();
		
		if(accDAO.isValidAccNum(accNum)) {
			if(accDAO.getId(accNum).equals(memDAO.getLogintID())) {
				System.err.println("[오류] 본인 계좌에는 이체할 수 없습니다!!");
			}
			else {
				System.out.print("[이체] 이체할 금액을 입력하세요 : ");
				int money = sc.nextInt();
				if(accDAO.getMoney(memDAO.getLogintID()) < money) {
					System.err.println("[오류] 잔액이 부족합니다.");
				}
				else {
					accDAO.setMoney(memDAO.getLogintID(), -money);	//이체 하는 사람 잔액 조정
					accDAO.setMoney(accDAO.getId(accNum), money);	//이체 받는 사람 잔액 조정
				}
			}
		}
		else {
			System.err.println("[오류] 계좌번호를 확인해주세요.");
		}
	}
	
	/* 잔액조회 */
	void balanceCheck() {
		System.out.println("[잔액] 잔액은 " + accDAO.getMoney(memDAO.getLogintID()) + "원 입니다.");
	}
	
	/* 로그아웃 */
	void logOut() {
		memDAO.setLoginID(null);
		System.out.println("[메시지] 로그아웃되었습니다.");
	}
	
	/* 탈퇴 */
	void deleteMember() {
		accDAO.deleteAccount(memDAO.getLogintID());
		memDAO.deleteMember(memDAO.getLogintID());
		System.out.println("[메시지] 탈퇴되었습니다. 이용해주셔서 감사합니다.");
	}
	
	void run() {
		while(true) {
			printMenu();
			
			try {
				int sel = sc.nextInt();
				sc.nextLine();	//메뉴 선택 후 Enter 처리
				
				if(sel == 1 && memDAO.getLogintID() == null) {
					joinMember();	//회원가입
				}
				else if(sel == 2 && memDAO.getLogintID() == null && 0 < memDAO.getMemberCount()) {
					loginMember();	//로그인
				}
				else if(sel == 3 && memDAO.getLogintID() != null) {
					deposit();	//입금
				}
				else if(sel == 4 && memDAO.getLogintID() != null) {
					 transfer();	//이체
				}
				else if(sel == 5 && memDAO.getLogintID() != null) {
					balanceCheck();	//잔액조회
				}
				else if(sel == 6 && memDAO.getLogintID() != null) {
					logOut();	//로그아웃
				}
				else if(sel == 7 && memDAO.getLogintID() != null) {
					deleteMember();	//탈퇴
				}
				else if(sel == 0) {
					System.out.println("종료 합니다.");
					break;
				}
				else if(sel <0 || 7 < sel) {
					System.err.println("[오류] 메뉴 선택 오류");
				}
				else {
					if(memDAO.getMemberCount() == 0) {
						System.err.println("[오류] 회원가입 먼저 해주세요!!");
					}
					else if(memDAO.getLogintID() == null) {
						System.err.println("[오류] 로그인 먼저 해주세요!!");
					}
					else {
						System.err.println("[오류] 로그아웃 먼저 해주세요!!");
					}
				}
			}catch (InputMismatchException e) {
				System.err.println("[오류] 숫자만 입력하세요!!");
			} finally {
				sc.nextLine();
			}
		}
	}
}

 

class ATM_Menu

package View;

import Model.AccountDAO;
import Model.MemberDAO;

public class ATM_Menu {
	
	public void getMenu(int mem_Count, String id, MemberDAO memDAO, AccountDAO accDAO) {
		System.out.println();
		System.out.println("[회원 수 : " + mem_Count + "명]");
		
		if(0 < mem_Count) {
			for(int i=0; i<mem_Count; i++) {
				System.out.println(memDAO.getMemberNum(i) + " " + memDAO.getMemberName(i) + "(" + accDAO.getMoney(i) + "원)");
			}
		}
		
		System.out.println("------------------");
		System.out.print("[접속자] : ");
		if(id == null) {
			System.out.println("없음");
		}
		else {
			System.out.println(id);
		}
		System.out.println("------------------");
        System.out.println("=== ATM ===");
		if(id == null) {
			System.out.println("1.회원가입\n2.로그인\n0.종료");
		}
		else {
			System.out.println("3.입금\n4.이체\n5.잔액조회\n6.로그아웃\n7.탈퇴\n0.종료");
		}
		System.out.print(">");
	}
}

 

class Member

package Model;

public class Member {
	private int mem_Number;
	private String id;
	private String name;
	
	protected int getMem_Number() {
		return mem_Number;
	}
	protected void setMem_Number(int mem_Number) {
		this.mem_Number = mem_Number;
	}
	protected String getId() {
		return id;
	}
	protected void setId(String id) {
		this.id = id;
	}
	protected String getName() {
		return name;
	}
	protected void setName(String name) {
		this.name = name;
	}
}

 

class MemberDAO

package Model;

import java.util.ArrayList;

public class MemberDAO {
	Member[] memberList;
	
	int mem_Count;		//회원수
	String login_ID;	//로그인된 ID
	
	public MemberDAO() {
		memberList = new Member[1];
		mem_Count = 0;
		login_ID = null;
	}
	
	/* 회원가입 */
	public void addMember(String id, String name){
		Member m = new Member();
		
		if(mem_Count == 0) {
			m.setMem_Number(1001);
		}
		else {
			//마지막 멤버번호
			int lastMemberNumber = memberList[memberList.length-1].getMem_Number();
			m.setMem_Number(lastMemberNumber+1);
		}
		m.setId(id);
		m.setName(name);
		
		if(mem_Count == 0) {
			memberList[mem_Count] = m;
		}
		else {
			Member[] tempList = new Member[memberList.length+1];
			for(int i=0; i<memberList.length; i++) {
				tempList[i] = memberList[i];
			}
			tempList[tempList.length-1] = m;
			memberList = tempList;
		}
		
		mem_Count = memberList.length;
	}
	
	/* ID확인 */
	public boolean isValidId(String id) {
		if(mem_Count == 0) {
			return true;
		}
		
		for(Member m : memberList) {
			if(m.getId().equals(id)) {
				return false;
			}
		}		
		return true;
	}
	
	/* 회원수 */
	public int getMemberCount() {
		return mem_Count;
	}
	
	/* 로그인 ID 추출 */
	public String getLogintID() {
		return login_ID;
	}
	
	/* 로그인 후 로그인된 ID 등록 */
	public void setLoginID(String id) {
		login_ID = id;
	}
	
	/* 메뉴용 회원번호 추출 */
	public int getMemberNum(int i) {
		return memberList[i].getMem_Number();
	}
	
	/* 메뉴용 회원이름 추출 */
	public String getMemberName(int i) {
		return memberList[i].getName();
	}
	
	/* 멤버 삭제 */
	public void deleteMember(String id) {
		Member[] tempList = new Member[memberList.length-1];
		
		for(int i=0; i<memberList.length; i++) {
			if(memberList[i].getId().equals(id)) {
				memberList[i] = null;
				
				for(int j=i; j<memberList.length-1; j++) {
					tempList[j] = memberList[j+1];
				}
				break;
			}
			else {
				tempList[i] = memberList[i];
			}
		}
		
		memberList = tempList;
		login_ID = null;
		mem_Count--;
	}
}

 

class Account

package Model;

public class Account {
	private String acc_Number;
	private String password;
	private int money;
	private String mem_ID;
	
	protected String getAcc_Number() {
		return acc_Number;
	}
	protected void setAcc_Number(String acc_Number) {
		this.acc_Number = acc_Number;
	}
	protected String getPassword() {
		return password;
	}
	protected void setPassword(String password) {
		this.password = password;
	}
	protected int getMoney() {
		return money;
	}
	protected void setMoney(int money) {
		this.money = money;
	}
	protected String getMem_ID() {
		return mem_ID;
	}
	protected void setMem_ID(String mem_ID) {
		this.mem_ID = mem_ID;
	}
}

 

class AccountDAO

package Model;

public class AccountDAO {
	Account[] accountList;
	
	public AccountDAO() {
		accountList = new Account[1];
	}
	
	/* 계좌 추가 */
	public void addAccount(String pw, String id, int mem_Count) {
		Account acc = new Account();
		
		if(mem_Count == 0) {
			acc.setAcc_Number("111111111");
		}
		else {
			//마지막 멤버 계좌
			int lastAccountNumber = Integer.parseInt(accountList[accountList.length-1].getAcc_Number());
			//마지막 멤버 계좌에 111111111 증가 후 문자열로 변환
			String accNumber = Integer.toString(lastAccountNumber+111111111);
			acc.setAcc_Number(accNumber);
		}
		acc.setPassword(pw);
		acc.setMoney(1000);
		acc.setMem_ID(id);
		
		if(mem_Count == 0) {
			accountList[mem_Count] = acc;
		}
		else {
			Account[] tempList = new Account[accountList.length+1];
			for(int i=0; i<accountList.length; i++) {
				tempList[i] = accountList[i];
			}
			tempList[tempList.length-1] = acc;
			accountList = tempList;
		}
	}
	
	/* 비밀번호 확인 */
	public boolean isValidPw(String id, String pw) {
		for(Account acc : accountList) {
			if(acc.getMem_ID().equals(id) && acc.getPassword().equals(pw)) {
				return true;
			}
		}
		return false;
	}
	
	/* 메뉴용 잔액 확인 */
	public int getMoney(int i) {
		return accountList[i].getMoney();
	}
	/* 잔액확인 (오버로딩) */
	public int getMoney(String id) {
		for(int i=0; i<accountList.length; i++) {
			if(accountList[i].getMem_ID().equals(id)) {
				return accountList[i].getMoney();
			}
		}
		return 0;
	}
	
	/* 입금 및 이체 */
	public void setMoney(String id, int money) {
		for(int i=0; i<accountList.length; i++) {
			if(accountList[i].getMem_ID().equals(id)) {
				accountList[i].setMoney(accountList[i].getMoney()+money);
			}
		}
	}
	
	/* 계좌번호 확인 */
	public boolean isValidAccNum(String accNum) {
		for(Account acc : accountList) {
			if(acc.getAcc_Number().equals(accNum)) {
				return true;
			}
		}
		return false;
	}
	
	/* 이체시 계좌와 일치한 ID추출 */
	public String getId(String accNum) {
		for(int i=0; i<accountList.length; i++) {
			if(accountList[i].getAcc_Number().equals(accNum)) {
				return accountList[i].getMem_ID();
			}
		}
		return null;
	}
	
	/* 계좌삭제 */
	public void deleteAccount(String id) {
		Account[] tempList = new Account[accountList.length-1];
		
		for(int i=0; i<accountList.length; i++) {
			if(accountList[i].getMem_ID().equals(id)) {
				accountList[i] = null;
				
				for(int j=i; j<accountList.length-1; j++) {
					tempList[j] = accountList[j+1];
				}
				break;
			}
			else {
				tempList[i] = accountList[i];
			}
		}
		
		accountList = tempList;
	}
}