자바은행 - 추상 클래스 적용
다음은 이클립스의 코드 어시스트 기능을 활용하여 사용자 정의 예외 클래스를 만드는 방법이다.
그림처럼 작성한다.
메소드 바디에서 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴가 나타나게 한다.
Source 와 Generate Constructors from SuperClass 메뉴를 차례로 선택하면 예외 클래스를 쉽게 만들 수 있다.
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(개정판) 저자: 김철회 출판사: 정보문화사
