자바은행 - 추상 클래스 적용

다음은 이클립스의 코드 어시스트 기능을 활용하여 사용자 정의 예외 클래스를 만드는 방법이다.
그림처럼 작성한다.

Using Eclipse Code Assistance 1

메소드 바디에서 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴가 나타나게 한다.
Source 와 Generate Constructors from 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);
  }

}

예제에선 문자열 인자를 가지는 생성자만 사용한다.
따라서 다음처럼 간단히 만들 수 있다.

InsufficientBalanceException.java
package net.java_school.bank;

public class InsufficientBalanceException extends RuntimeException {

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

}
DuplicateAccountException.java
package net.java_school.bank;

public class DuplicateAccountException extends RuntimeException {

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

}

과제

두 예외 클래스를 은행 예제에 적용시킨다.

추상 클래스 적용

마이너스 계좌뿐 아니라 성격이 다른 계좌가 프로그램에 추가될 수 있다.
일반 계좌로 사용했던 Account 클래스를 추상 클래스로 수정하고, 일반 계좌와 마이너스 계좌를 Account 추상 계좌 클래스를 상속하도록 변경한다.
새로운 종류의 계좌가 더 필요하다면 Account 추상 계좌 클래스를 상속하여 만든다.

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

Account.java
public abstract class Account {
  private String accountNo;
  private String name;
  protected double balance;
  protected List<Transaction> transactions = new ArrayList<Transaction>();

  static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd");
  static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm:ss");
  static final String DEPOSIT = "입금";
  static final String WITHDRAW = "출금";
  static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance();

  //.. 중간 생략 ..
            
  public abstract void withdraw(double amount);

  //.. 중간 생략 ..
    
  public String getKind():

  //.. 중간 생략 ..
  
}
NormalAccount.java
package net.java_school.bank;

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

public class NormalAccount extends Account {
  static final String KIND = "일반";

  public NormalAccount() {}

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

  public NormalAccount(String accountNo, String name, double balance) {
    super(accountNo, name, balance);
  }
    
  @Override
  public void withdraw(double 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.setBalance(balance);
    transaction.setKind(Account.WITHDRAW);
    transactions.add(transaction);
  }

  @Override
  public String getKind() {
    return KIND;
  }
        
}
MinusAccount.java
package net.java_school.bank;

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

public class MinusAccount extends Account {
  static final String KIND = "마이너스";
    
  public MinusAccount() {}

  public MinusAccount(String accountNo, String name) {
    super(accountNo, name);
  }

  public MinusAccount(String accountNo, String name, double balance) {
    super(accountNo, name, balance);
  }
    
  @Override
  public void withdraw(double amount) {
    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.setBalance(balance);
    transaction.setKind(Account.WITHDRAW);
    transactions.add(transaction);
  }
        
  @Override
  public String getKind() {
    return KIND;
  }

}
Bank.java
public class Bank {
 
  //..중간 생략..

  @Override
  public void addAccount(String accountNo, String name) {
    Account account = this.getAccount(accountNo);
    if (account != null ) throw new DuplicateAccountException("중복된 계좌입니다.");
      accounts.add(new NormalAccount(accountNo, name));
    }

  @Override
  public void addAccount(String accountNo, String name, double balance) {
    Account account = this.getAccount(accountNo);
    if (account != null ) throw new DuplicateAccountException("중복된 계좌입니다.");
    accounts.add(new NormalAccount(accountNo, name, balance));

  }

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

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