Last Modified : 2011.01.02

자바은행 (구현)

분석 작업의 결과물인 클래스 다이어그램을 토대로 각각의 클래스를 작성한다.

Account.java

package net.java_school.javabank;

public class Account {
	private String accountNo;	//계좌번호
	private long balance;		//잔고

	public Account(String accountNo, long balance) {
		this.accountNo = accountNo;
		this.balance = balance;
	}

	public String getAccountNo() {
		return accountNo;
	}
	 
	public void setAccountNo(String accountNo) {
		this.accountNo = accountNo;
	}
	 
	public long getBalance() {
		return balance;
	}
	 
	public void setBalance(long balance) {
		this.balance = balance;
	}
	 
	public void deposit(long money) {
		balance = balance + money;
	}
	 
	public void withdraw(long money) {
		balance = balance - money;
	}

}

Customer.java

package net.java_school.javabank;

public class Customer {
	
	private String id;
	private String name;
	private Account[] accounts = new Account[3];    //계좌 3개까지
	private int totalAccount;                       //총 계좌수
	
	public Customer(String id, String name) {
		this.id = id;
		this.name = name;
	}
	     
    public void addAccount(String accountNo, long balance) {
        Account account = new Account(accountNo, balance);
        accounts[totalAccount++] = account;
    }
     
    public Account getAccount(String accountNo) {
        Account account = null;
        for ( int i = 0; i < totalAccount; i++ ) {
            if ( accountNo.equals(accounts[i].getAccountNo()) ) {
                account = accounts[i];
                break;
            }
        }
         
        return account;
    }
     
    public String getId() {
        return id;
    }
     
    public void setId(String id) {
        this.id = id;
    }
     
    public String getName() {
        return name;
    }
     
    public void setName(String name) {
        this.name = name;
    }
     
    public Account[] getAccounts() {
        return accounts;
    }
    
    public int getTotalAccount() {
    	return totalAccount;
    }
}

Bank.java

package net.java_school.javabank;

public class Bank {
	
	private Customer[] customers = new Customer[100];	//고객은 100명까지
	private int totalCustomer;							//총 고객수
	
	public Customer[] getCustomers() {
		return customers;
	}
	
	public void addCustomer(String id, String name) {
		Customer customer = new Customer(id, name);
		customers[totalCustomer++] = customer;
	}
	
	public Customer getCustomer(String id) {
		Customer customer = null;
		for ( int i = 0; i < totalCustomer; i++ ) {
			if ( customers[i].getId().equals(id) ) {
				customer = customers[i];
				break;
			}
		}
		
		return customer;
	}
	
	public int getTotalCustomer() {
		return totalCustomer;
	}
	
}

다음은 사용자와 대화하는 클래스이다.
이곳에만 표준출력메소드(System.out.println(..))를 이용해서 출력하는 코드와 익셉션을 처리하는 코드를 두는 것이 좋은 코드이다.

BankCUI.java

package net.java_school.javabank;

import java.io.*;

public class BankCUI {
	
	private Bank bank = new Bank();
	
	{
		// 테스트 데이터
		bank.addCustomer("kim", "김태희");
		bank.addCustomer("park", "박지성");
		Customer customer = bank.getCustomer("kim");
		customer.addAccount("111", 1000);
		customer = bank.getCustomer("park");
		customer.addAccount("222", 500);
	}
	
	public BankCUI() throws IOException {
		showMenu();
	}
	
	public void showMenu() throws IOException {
		String menu = null;
		String id = null;
		String name = null;
		
		do {
			System.out.println(" ** 메뉴를 선택하세요 ** ");
			System.out.println(" 1 *** 고객 등록   ");
			System.out.println(" 2 *** 고객 검색   ");
			System.out.println(" 3 *** 고객 목록   ");
			System.out.println(" 4 *** 계좌 생성   ");
			System.out.println(" 5 *** 입금   ");
			System.out.println(" 6 *** 출금   ");
			System.out.println(" q *** 종료   ");
			System.out.println(" ********************** ");
			System.out.print(">>");
			BufferedReader br = 
				new BufferedReader(new InputStreamReader(System.in));
			menu = br.readLine();
			
			try {
				if ( menu.equals("1") ) {
					// 고객 등록
					System.out.print("아이디를 입력하세요>>");
					id = br.readLine();
					System.out.print("이름을 입력하세요>>");
					name = br.readLine();
					bank.addCustomer(id, name);
					Customer customer = bank.getCustomer(id);
					System.out.print("계좌번호를 입력하세요>>");
					String accountNo = br.readLine();
					System.out.print("초기 잔액을 입력하세요>>");
					long balance = Long.parseLong(br.readLine());
					customer.addAccount(accountNo, balance);
				} else if ( menu.equals("2") ) {
					// 고객 검색
					System.out.print("아이디를 입력하세요>>");
					id = br.readLine();
					Customer customer = bank.getCustomer(id);
					System.out.println(
							customer.getId() + ":" + 
							customer.getName());
					Account[] accounts = customer.getAccounts();
					int totalAccount = customer[i].getTotalAccount();
					for ( int i = 0; i < totalAccount; i++ ) {
						System.out.println(
								"\t" + "계좌번호:" + 
								accounts[i].getAccountNo() + " 잔고:" +
								accounts[i].getBalance() + "원");
					}
				} else if ( menu.equals("3") ) {
					// 고객 목록
					Customer[] customers = bank.getCustomers();
					int totalCustomer = bank.getTotalCustomer();
					for ( int i = 0; i < totalCustomer; i++ ) {
						System.out.println(
								customers[i].getId() + ":" + 
								customers[i].getName());
						Account[] accounts = customers[i].getAccounts();
						int totalAccount = customer.getTotalAccount();
						for ( int j = 0; j < totalAccount; j++ ) {
							System.out.println(
									"\t" + "계좌번호:" + 
									accounts[j].getAccountNo() + " 잔고:" +
									accounts[j].getBalance() + "원");
						}
						System.out.println("--------------------------------");
					}
				} else if (menu.equals("4")) {
					// 계좌 생성
				} else if (menu.equals("5")) {
					// 입금
				} else if (menu.equals("6")) {
					// 출금
				}
				System.out.println();
			}catch (Exception e) {
				System.out.println(e.getMessage());
			}
		} while ( !menu.equals("q") );
	}
	
	public static void main(String[] args) throws IOException {
		new BankCUI();
	}
	
}
아래 내용을 구현하시오.
  • 계좌 생성 -BankCUI:96라인
  • 입금 메뉴 -BankCUI:98라인
  • 출금 메뉴 -BankCUI:100라인
  • 사용된 배열을 모두 ArrayList로 변경 -Customer:7라인, Bank:5라인
  • 프로그램이 끝나기 전 Bank 객체를 파일에 저장하고, 프로그램이 시작하면 다시 파일에서 저장된 객체정보로부터 Bank객체를 생성하도록 수정(스트림 참조)
  • 잔고를 1,000,000 와 같이 표현
  • Customer클래스에 toString()메소드를 오버라이딩하여 고객정보와 계좌정보를 출력하는 코드(BankCUI의 고객검색과 고객목록부분)를 간단하게 되도록 수정
  • Account클래스(일반입출금계좌)와 Account를 상속한 AccountMiius(마이너스계좌)를 만들어서 계좌를 생성할 때 선택할 수 있도록 수정
  • Account추상클래스(withdraw()만 추상메소드)와 Account를 상속한 AccountNorm(일반입출금계좌) 와 Account를 상속한 AccountMiius(마이너스계좌)를 만들어서 계좌를 생성할 때 선택할 수 있도록 수정
  • deposit(),withdraw(),getBalance()추상메소드를 가지는 Account인터페이스를 작성하고 Account를 구현하는 AccountNorm클래스와 AccountMinus클래스를 만들어서 계좌를 생성할 때 선택할 수 있도록 수정

참고문서

New 알기쉬운 자바2(개정판) 저자: 김철회 출판사: 정보문화사