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