아래 클래스 다이어그램을 참고하여 섹션 4에서 만들었던 은행 관련 클래스들을 확장해보자.


package chapter07.exercise.advanced;
public class BankAccount {
/**
* 계좌의 잔액
*/
protected int balance;
public BankAccount(int balance) {
this.balance = balance;
}
public int getBalance() {
return balance;
}
/**
* 입금 메소드
* @param amount 입금할 금액
*/
public void deposit(int amount) {
balance += amount;
}
/**
* 출금 메소드
* @param amount 출금할 금액
* @return 출금 성공시 true, 실패시 false 반환
*/
public boolean withdraw(int amount) {
if (balance >= amount) {
balance -= amount;
return true;
}
return false;
}
/**
* 이체 메소드
* @param amount 이체할 금액
* @param otherAccount 이체될 계좌번호
* @return 이체 성공시 true, 실패시 false 반환
*/
public boolean transfer(int amount, BankAccount otherAccount) {
if (withdraw(amount)) {
otherAccount.deposit(amount);
return true;
}
return false;
}
@Override
public String toString() {
return String.format("%,d", balance);
}
}

package chapter07.exercise.advanced;
public class SavingsAccount extends BankAccount {
private double interestRate;
public SavingsAccount(int balance, double interestRate) {
super(balance);
this.interestRate = interestRate;
}
public void updateBalance(int period) {
balance += balance * interestRate * period;
}
}

package chapter07.exercise.advanced;
public class CheckingAccount extends BankAccount {
private SavingsAccount protectedBy;
public CheckingAccount(int balance) {
super(balance);
}
public CheckingAccount(int balance, SavingsAccount protectedBy) {
super(balance);
this.protectedBy = protectedBy;
}
@Override
public boolean withdraw(int amount) {
// 만약 SavingsAccount에 10000원이 있고,
// CheckingAccount에 5000원이 있을 경우
// 백지수표로 7500원짜리 물건을 구매했을 경우
if (amount > balance) {
protectedBy.balance -= amount - balance;
balance = 0;
return true;
}
return super.withdraw(amount);
}
}

package chapter07.exercise.advanced;
public class Customer {
/**
* 고객 이름
*/
private String firstName;
/**
* 고객 성
*/
private String lastName;
/**
* 고객이 소유한 계좌
*/
private BankAccount[] accounts;
private int numberOfAccounts;
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
accounts = new BankAccount[5];
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void addAccount(BankAccount account) {
accounts[numberOfAccounts++] = account;
}
public BankAccount getAccount(int index) {
return accounts[index];
}
public int getNumberOfAccounts() {
return numberOfAccounts;
}
@Override
public String toString() {
return String.format("이름: %s %s, 계좌의 갯수: %,d", firstName, lastName, numberOfAccounts);
}
}
package chapter07.exercise.advanced;
public class BankTest {
public static void main(String[] args) {
Bank bank = new Bank();
Customer customer1 = new Customer("Tony", "Stark");
SavingsAccount customer1SavingsAccount = new SavingsAccount(2000, 0.01);
customer1.addAccount(customer1SavingsAccount);
customer1.addAccount(new CheckingAccount(3000, customer1SavingsAccount));
bank.addCustomer(customer1);
Customer customer2 = new Customer("Peter", "Parker");
customer2.addAccount(new CheckingAccount(2000));
bank.addCustomer(customer2);
Customer customer3 = new Customer("Steve", "Rogers");
SavingsAccount customer3SavingsAccount = new SavingsAccount(2000, 0.03);
customer3.addAccount(customer3SavingsAccount);
customer3.addAccount(new CheckingAccount(1000, customer3SavingsAccount));
bank.addCustomer(customer3);
System.out.println(customer3.getFirstName() + "의 SavingsAccount 잔고: " + customer3.getAccount(0) + "원");
System.out.println(customer3.getFirstName() + "의 CheckingAccount 잔고: " + customer3.getAccount(1) + "원");
System.out.println();
System.out.println("새로운 withdraw 메소드 실험(1,400원 인출)");
customer3.getAccount(1).withdraw(1400);
System.out.println(customer3.getFirstName() + "의 SavingsAccount 잔고: " + customer3.getAccount(0) + "원");
System.out.println(customer3.getFirstName() + "의 CheckingAccount 잔고: " + customer3.getAccount(1) + "원");
System.out.println();
printCustomers(bank.getCustomers());
// 10개월 후의 이자 계산
for (Customer c : bank.getCustomers()) {
if (c != null) {
for (int i = 0; i < c.getNumberOfAccounts(); i++) {
if (c.getAccount(i) instanceof SavingsAccount) {
((SavingsAccount) c.getAccount(i)).updateBalance(10);
}
}
}
}
System.out.println("10개월 후 잔액");
printCustomers(bank.getCustomers());
}
private static void printCustomers(Customer[] customers) {
for (Customer c : customers) {
if (c != null) {
System.out.println(c);
for (int i = 0; i < c.getNumberOfAccounts(); i++) {
System.out.println("계좌 종류: " + c.getAccount(i).getClass().getSimpleName() + ", 잔고: " + c.getAccount(i) + "원");
}
System.out.println();
}
}
}
}

'Java > 과제' 카테고리의 다른 글
chapter 08) 인터페이스example - BankAccount 클래스 변경 (0) | 2022.08.31 |
---|---|
chapter 08) 인터페이스example - Shape 클래스 변경하기 (0) | 2022.08.31 |
chapter 07) 상속example - 도형 관련 클래스 만들기 (0) | 2022.08.26 |
chapter 07) 상속example - Student 클래스 만들기 (0) | 2022.08.26 |
chapter06) 클래스 example - NewCar (0) | 2022.08.24 |