이 게시글에서는 기존에 만들었던 은행 프로그램과 달리, 계좌의 기본 기능을 확장해 '마이너스 계좌'를 만들어보고자 한다.
상속이라는 개념을 어떻게 활용하면 되는지 알아 보자.
package kr.s23.object.bank;
public class BankAccount {
//멤버 변수
protected String number;
protected String password;
protected String name;
protected long balance;
//생성자
public BankAccount(String number, String password, String name, long balance) {
this.number = number;
this.password = password;
this.name = name;
this.balance = balance;
System.out.println(this.name + "님의 계좌가 개설되었습니다.");
}
//입금하기(메서드)
public void deposit(long amount) {
if(amount <=0) {
System.out.println("0 이하의 금액은 입금할 수 없습니다.");
return;//특정 조건일 때 void 메서드를 빠져 나오도록 하기 위함
//else를 안 쓰기 위해!
}
balance += amount;
System.out.println(amount + "원이 입금되었습니다.");
}
//출금하기(메서드)
public void withdraw(long amount) {
if(amount <=0) {
System.out.println("0 이하의 금액은 출금할 수 없습니다.");
return;
}
if(balance < amount) {
System.out.println("잔액이 부족합니다.");
return;
}
balance -= amount;
System.out.println(amount + "원이 출금되었습니다.");
}
//잔고 확인(메서드)
public void printAccount() {
System.out.println("========================");
System.out.println("(일반) 계좌번호: " + number);
System.out.println("비밀번호: " + password);
System.out.println("예금주: " + name);
System.out.printf("계좌 잔액: %,d원%n", balance);
System.out.println("==========================");
}
}
BankAccount 클래스의 경우 4개의 멤버변수와 1개의 생성자, 3개의 멤버메서드를 갖는다.
메서드의 종류로는 1. 입금하기 deposit() 2. 출금하기 withdraw() 3. 잔고 확인 printAccount() 이 있으며,
접근제한자로 protected를 갖는 멤버변수를 다른 클래스에서 출력하기 위해서는 원칙적으로 getter가 필요하나, 이 경우에는 잔고 확인 메서드가 그 역할을 대신한다.
package kr.s23.object.bank;
public class MinusAccount extends BankAccount{
private long minusLimit;//마이너스 한도
//생성자
public MinusAccount(String number, String password, String name,
long balance, long minusLimit) {
super(number, password, name, balance);
this.minusLimit = minusLimit;
}
//메서드 오버라이딩(재정의)
@Override
public void withdraw(long amount) {
if(amount <= 0) {
System.out.println("0 이하의 금액은 출금할 수 없습니다.");
return;
}
if(balance + minusLimit < amount) {
System.out.println("한도 초과로 출금되지 않습니다.");
return;
}
balance -= amount;
System.out.printf("%,d원이 출금되었습니다.%n", amount);
}
//메서드 오버라이딩(재정의) 2
@Override
public void printAccount() {
System.out.println("==========================");
System.out.println("(마이너스) 계좌번호: " + number);
System.out.println("비밀번호: " + password);
System.out.println("예금주: " + name);
System.out.printf("계좌 잔액: %,d원%n", balance);
System.out.printf("마이너스 한도: %,d원%n", minusLimit);
System.out.println("==========================");
}
}
우선 MinusAccount는 BankAccount를 상속받아 기본 기능을 탑재한 상태에서 확장하는 방식을 사용하고자 한다.
ex. public class MinusAccount extends BankAccount{}
상속 관계가 형성됨에 따라 MinusAccount가 가지고 있는 minusLimit 변수 외에 BankAccount의 멤버변수인 number, password, name, balance를 자신의 멤버변수인 것처럼 사용할 수 있게 된다.
참고) 상속 (개념)
참고) 상속 (super, super())
또한, BankAccount의 메서드 중 '출금하기'와 '잔고 확인하기'를 오버라이딩하여 자신에 맞게 확장, 사용할 수 있다.
참고) 상속 (메서드 오버라이딩)
예를 들면 BankAccount와 달리 MinusAccount는 잔고(balance)에 마이너스 한도(minusLimit)가 포함되어 있는 것을 확인할 수 있다.
ex. BankAccount : if(balance < amount)
MinusAccount : if(balance + minusLimit < amount)
package kr.s23.object.bank;
public class BankMain {
public static void main(String[] args) {
//일반 계좌 생성
BankAccount bank = new BankAccount("100-123", "1234", "홍길동", 10000L);
//계좌 정보 출력
bank.printAccount();
//입금하기
bank.deposit(2000L);
//계좌 정보 출력
bank.printAccount();
//출금 하기
bank.withdraw(12000L);
//계좌 정보 출력
bank.printAccount();
System.out.println("=======================");
//마이너스 계좌 생성
MinusAccount ma = new MinusAccount("123-101", "5432", "박문수", 10000L, 1000L);
//마이너스 계좌 정보 출력
ma.printAccount();
//입금하기
ma.deposit(10000L);
//마이너스 계좌 정보 출력
ma.printAccount();
//출금 하기
ma.withdraw(21000L);
//마이너스 계좌 정보 출력
ma.printAccount();
}
}
계좌 생성을 담당할 BankMain 클래스에서 각 생성자에 맞게 필요한 인자를 넣어 주어 객체를 생성하고, 멤버 메서드를 활용해 필요한 정보를 출력하는 것을 확인할 수 있다.
출력)
홍길동님의 계좌가 개설되었습니다.
========================
(일반) 계좌번호: 100-123
비밀번호: 1234
예금주: 홍길동
계좌 잔액: 10,000원
==========================
2000원이 입금되었습니다.
========================
(일반) 계좌번호: 100-123
비밀번호: 1234
예금주: 홍길동
계좌 잔액: 12,000원
==========================
12000원이 출금되었습니다.
========================
(일반) 계좌번호: 100-123
비밀번호: 1234
예금주: 홍길동
계좌 잔액: 0원
==========================
=======================
박문수님의 계좌가 개설되었습니다.
==========================
(마이너스) 계좌번호: 123-101
비밀번호: 5432
예금주: 박문수
계좌 잔액: 10,000원
마이너스 한도: 1,000원
==========================
10000원이 입금되었습니다.
==========================
(마이너스) 계좌번호: 123-101
비밀번호: 5432
예금주: 박문수
계좌 잔액: 20,000원
마이너스 한도: 1,000원
==========================
21,000원이 출금되었습니다.
==========================
(마이너스) 계좌번호: 123-101
비밀번호: 5432
예금주: 박문수
계좌 잔액: -1,000원
마이너스 한도: 1,000원
==========================