본문 바로가기

Java/과제

chapter 07) 상속example - 은행 관련 클래스 확장하기

아래 클래스 다이어그램을 참고하여 섹션 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();
			}
		}
	}
}

Recent Posts
Popular Posts
Tags
더보기
Recent Comments