java-school logo

자바은행 수정(추상클래스 적용)

출금시 잔액이 부족할 때 발생시킬 사용자 정의 예외 클래스를 작성한다. 아래 그림처럼 RuntimeException을 상속하도록 InsufficientBalanceException.java를 작성하고 저장한다. Using Eclipse Code Assistance 1 에디터 뷰에서 마우스 오른쪽 버튼으로 컨텍스트 메뉴를 보이게 한 후, Source - Generate Constructors form SuperClass...를 차례로 선택하여 생성자를 만든다. Using Eclipse Code Assistance 2

InsufficientBalanceException.java
package net.java_school.bank;

public class InsufficientBalanceException extends RuntimeException {

	public InsufficientBalanceException() {
		super();
	}

	public InsufficientBalanceException(String message, Throwable cause) {
		super(message, cause);
	}

	public InsufficientBalanceException(String message) {
		super(message);
	}

	public InsufficientBalanceException(Throwable cause) {
		super(cause);
	}

}

중복된 계좌를 등록하려 할 때 발생시킬 예외 클래스를 위와 동일한 방법으로 생성한다.

DuplicateAccountException.java
package net.java_school.bank;

public class DuplicateAccountException extends RuntimeException {

	public DuplicateAccountException() {
		super();
	}

	public DuplicateAccountException(String message, Throwable cause) {
		super(message, cause);
	}

	public DuplicateAccountException(String message) {
		super(message);
	}

	public DuplicateAccountException(Throwable cause) {
		super(cause);
	}

}

기존의 계좌 클래스를 추상 클래스로 수정하고, 일반 계좌와 마이너스 계좌를 추상 계좌 클래스를 상속하도록 수정해 보자. 새로운 종류의 계좌가 필요하면 추상 계좌 클래스를 상속하여 만들면 된다.

계좌(Account) 클래스를 추상 클래스로 변경한다. 출금 메서드 withdraw()를 추상 메서드로 변경한다.

Account.java
public abstract class Account {

	//.. 기존 코드와 같다..
		
	public abstract void withdraw(long amount);
	
	//.. 기존 코드와 같다 .. 
}

출금액이 잔액보다 클 수 없는 일반 계좌를 생성한다.

NormalAccount.java
package net.java_school.bank;

import java.util.Calendar;
import java.util.Date;

public class NormalAccount extends Account {

	public NormalAccount() {}
	
	public NormalAccount(String accountNo, String name, String kind) {
		super(accountNo, name, kind);
	}

	public NormalAccount(String accountNo, String name, long balance, String kind) {
		super(accountNo, name, balance, kind);
	}
	
	@Override
	public void withdraw(long amount)  {
		if (amount > balance) {
			throw new InsufficientBalanceException("잔액이 부족합니다.");
		}
		balance = balance - amount;
		Transaction transaction = new Transaction();
		Calendar cal = Calendar.getInstance();
		Date date = cal.getTime();
		transaction.setTransactionDate(Account.DATE_FORMAT.format(date));
		transaction.setTransactionTime(Account.TIME_FORMAT.format(date));
		transaction.setAmount(amount);
		transaction.setKind(Account.WITHDRAW);
		transaction.setBalance(this.balance);
		transactions.add(transaction);
	}
	
}
Bank.java
package net.java_school.bank;

import java.util.ArrayList;
import java.util.List;

public class Bank {
	private ArrayList<Account> accounts = new ArrayList<Account>();

	public void addAccount(String accountNo, String name, String kind) {
		Account account = getAccount(accountNo);
		if (account != null) throw new DuplicateAccountException("중복된 계좌입니다.");
		
		if (Account.NORMAL.equals(kind)) {
			accounts.add(new NormalAccount(accountNo, name, kind));
		} else if (Account.MINUS.equals(kind)) {
			accounts.add(new MinusAccount(accountNo, name, kind));
		}
	}
	
	public void addAccount(String accountNo, String name, long balance, String kind) {
		Account account = getAccount(accountNo);
		if (account != null) throw new DuplicateAccountException("중복된 계좌입니다.");
		
		if (Account.NORMAL.equals(kind)) {
			accounts.add(new NormalAccount(accountNo, name, balance, kind));
		} else if (Account.MINUS.equals(kind)) {
			accounts.add(new MinusAccount(accountNo, name, balance, kind));
		}
	}
	
	//.. 중간 생략 ..  
	
}
참고