z2soo's Blog

JAVA Class (연습) ATM 구현 본문

Programming/JAVA

JAVA Class (연습) ATM 구현

z2soo 2023. 1. 12. 17:34
반응형

1. 프로젝트의 흐름도

Member 클래스 (회원정보)

  1.  n명 정보 입력
  2. 컨테이너(ArrayList 타입의 customer)에 저장

 

ATM Machine 클래스

  1. 컨테이너(고객정보 DB 역할)를 가져와서 연결
  2. 해당 클래스에 특정 회원을 찾아서 로그인 하는 기능 존재
  3. 로그인 후 볼 수 있는 개인 회원용 메뉴 제작
    [1] 잔액조회 →로그인된 고객의 잔액 출력 
    [2] 입금 → 금액을 입금(누적)
    [3] 출금 → 잔액에서 차감
    [4] 종료 →  현재 실행되고 있는 메뉴 종료

 

ATMPlay 클래스

  1. 프로그램 시작 
  2. 고객 정보 컨테이너 생성
  3. 고객 정보 저장
  4. ATMMachine 객체 생성 
  5. 고객 정보 넘겨줌

 

2. Java Code

Member

package ATMpackage;
public class Member {
	
	//속성
	private String mName;	
	private String mAccountNo;	
	private int mBalance;	
	private String mId;	
	private String mPw; 
	
	//생성자
	Member(String n, String a, String id, String pw){
		mName=n;
		mAccountNo=a;
		mId=id;
		mPw=pw;
	}
	
	//putter, getter, setter	
	void putmName() {System.out.println("이름: "+mName);}
	void putmAccountNo() {System.out.println("계좌번호: "+mAccountNo);}
	void putmId() {System.out.println("아이디: "+mId);}
	void putmPw() {System.out.println("암호: "+mPw);}
	void putmBalance() {System.out.println("잔액: "+mBalance);}
	void putmInfo() {System.out.print("===회원정보 출력===")
		;putmId();putmName();putmAccountNo();putmBalance();
		System.out.print("==============");}
		
	void setName(String n) {mName=n;}
	void setAccountNo(String a) {mAccountNo=a;}
	void setId(String id) {mId=id;}
	void setPw(String pw) {mPw=pw;}
	void setBalance(int b) {mBalance=b;}
	
	String getName() {return mName;}
	String getAccountNo() {return mAccountNo;}
	String getId() {return mId;}
	String getPw() {return mPw;}
	int getBalance() {return mBalance;}	
	
	void dMoney(int m) {
		int mNow = getBalance();
		setBalance(mNow+m);
	}
	
	void wMoney(int m) {
		int mNow = getBalance();
		if (mNow < m) {
			System.out.print("잔액이 부족합니다.");
		} else {
		setBalance(mNow-m);
		}
	}
}

 

ATMachine

package ATMpackage;
import java.util.ArrayList;
import java.util.Scanner;

//===== ATMachine 클래스 제작
// 고객 정보를 기반으로 입출금 및 잔액조회 등의 기능을 수행하는 곳
// 1) 이 클래스는 기본적으로 고객 정보를 전달받아야 한다. 내부에 저장되어 있어야 한다는 의미
// 2) 그렇다면 클래스의 속성 중에 고객정보 컨테이너를 연결할 수 있는 부분이 있어야 함
// 3) ATMachine 클래스는 입금(putMoney), 출금(getMoney), 잔액조회(displayBalance)를 가지고 있다. 
// 4) 생성자로는 고객정보 컨테이너를 전달받고록 한다. 
//=====

public class ATMachine {

	ArrayList<Member> bankCustomers; //여기에 고객정보를 가진 컨테이너를 연결할 수도 있다. 
	
	//이 생성자는 고객 정보를 가진 컨테이너를 전달받는다. 
	// 즉, ATMachine 객체가 만들어지면서 즉시 고객정보를 연결해준다는 의미이다. 
	ATMachine(ArrayList<Member> cus){
		bankCustomers = cus;
	}	
	
	//로그인 기능을 처리할 수 있는 메소드
	void mLogin() {
		//아이디와 암호를 저장할 임시변수
		String loginId;
		String loginPw;
		boolean loginCheck = false;
		
		//아이디와 암호 입력받기
		Scanner input = new Scanner(System.in);
		System.out.print("아이디: "); loginId=input.next();
		System.out.print("암호: "); loginPw=input.next();
		
		//고객정보에서 일치하는 아이디 찾기
		//메뉴 종료 변수
		boolean exitMenu = false;
		for (Member x: bankCustomers) {
			//아이디 일치 확인
			if (x.getId().equals(loginId)) {
				//암호 일치 확인
				if (x.getPw().equals(loginPw)) {					
					System.out.println("로그인되었습니다!!!"); 		
					//회원정보 출력
					x.putmInfo();	
					//로그인 확인용 
					loginCheck = true;					
					
					//==============개인메뉴==============
					//[1] 잔액조회 →로그인된 고객의 잔액 출력 
					//[2] 입금 → 금액을 입금(누적)
					//[3] 출금 → 잔액에서 차감
					//[4] 종료 →  현재 실행되고 있는 메뉴 종료
					int menu;
					while(true) {
						System.out.println("=====검색=====");
						System.out.println("[1] 잔액조회 [2] 입금 [3] 출금 [4] 종료");
						System.out.println("메뉴번호를 입력하세요.");
						menu = input.nextInt(); //메뉴번호 입력
						switch(menu) {
							case 1:{
								x.putmBalance();
							} break;
							case 2:{
								System.out.println("입금액: ");
								int money = input.nextInt();
								x.dMoney(money);
							} break;
							case 3:{
								System.out.println("출금액: ");
								int money = input.nextInt();
								x.wMoney(money);								
							} break;
							case 4:{
								//메뉴 종료 부분으로 break를 사용하더라도 밖에 while이 있어 종료 불가하다
								//while과 for 둘 다 탈출하는 방법을 찾아보자
								exitMenu=true;
								break;
							} 					
						} //-switch
						if (exitMenu) {break;} //while 탈출 여부									
					}	//-while
					//=================================
				} //-if
			} //-if		
			if (exitMenu) {break;} //for 탈출 여부				
			} //-for		
		if (loginCheck != true) {
			System.out.print("회원 정보가 없습니다.");
		}
		}		
}

 

ATMPlay

package ATMpackage;
import java.util.ArrayList;

public class ATMPlay {
	public static void main(String[] args) {
		//컨테이너를 hashmap으로 만든다. 
		//열쇠: 문자열, 데이터:  Member 타입
		//HashMap<String, Member> container = new HashMap<String, Member>();
		ArrayList<Member> customer = new ArrayList<Member>();
		
		//=====회원 생성
		Member m1=new Member("벤투","001-1111-2222","admin","123##");
		Member m2=new Member("이강인","002-2222-3343","lee999","9999");
		Member m3=new Member("손흥민","003-3333-6534","Kang","4321");
		
		//=====고객정보 저장 및 잔액 설정
		customer.add(m1); customer.add(m2); customer.add(m3);
		customer.get(0).setBalance(570000);
		customer.get(1).setBalance(890000);
		customer.get(2).setBalance(553000);

		//=====ATM 객체를 생성해서 고객정보(customer)를 넘겨준다. 
		ATMachine atm = new ATMachine(customer);
//		atm.putAllCustomerInfo();
		atm.mLogin();				
	}
}

 

3. 수정사항

  1. 메뉴 부분에 대해 복잡하게 중첩되어 있는 항목을 따로 class 생성하여 정리
    : 메소드의 형태로 만들어서 하나의 작업만을 진행하도록 하는게 이상적인 코드
  2. 최종적으로 원하는 흐름
    : ATMPlay → mLogin → 로그인된 아이디 반환 → 그 아이디 저장 → 메뉴 실행 및 종료 → ATMPlay 돌아옴 → 로그인된 상태로 다른 작업 가능(아이디를 저장한 상태)
반응형

'Programming > JAVA' 카테고리의 다른 글

JAVA의 Class (9) 추상 클래스  (0) 2023.01.18
JAVA의 Class (8) Instanceof 연산자  (0) 2023.01.13
JAVA 멀티스레드 (연습)  (0) 2023.01.11
JAVA 멀티스레드  (0) 2023.01.11
JAVA의 Class (7) 오버로딩과 오버라이딩  (0) 2022.12.28
Comments