Java
[Java] 상속 - 계좌 프로그램
안도일
2022. 12. 2. 21:56
상속을 활용하여 다양한 계좌 프로그램을 작성해보자.
Account 클래스
가장 기본 계좌 클래스인 Account.java 작성
public class Account {
//final을 추가하면 상속이 금지됨
//abstract를 추가하면 객체가 추상화 되어 상속등 활용은 가능하지만 그자체의 객체 생성은 하지 못한다
String accountNo;
String ownName;
int bal;
Account(String accountNO, String ownName, int bal){
this.accountNo = accountNO;
this.ownName = ownName;
this.bal = bal;
}
void printAccount() {
System.out.println("계좌번호: " + accountNo);
System.out.println("예금주: " + ownName);
System.out.println("잔액: " + bal);
System.out.println();
}
void deposit(int amnt) {
bal += amnt;
}
int withdraw(int amnt) throws Exception{
if(amnt > bal)
throw new Exception("잔액 부족!!!"); //예외를 던짐
bal -= amnt;
return amnt;
}
}
체크카드 사용 계좌
CheckAccount 클래스
기존 Account 클래스를 상속받아 체크카드 기능을 추가한 계좌를 작성
public class CheckAccount extends Account{
String cardNo;
CheckAccount(String accountNo, String ownName, int bal, String cardNo){
// 상위 생성자를 호출하는 super()가 생략되어 있다. 여기선 Account() 기본 생성자를 호출한다.
// 만약 Account 클래스에 Account() 기본 생성자가 선언되어 있지 않다면 오류가 발생함
// 따라서 아래와 같이 사용함.
super(accountNo, ownName, bal);
this.cardNo = cardNo;
}
int pay(String cardNo, int amnt) throws Exception{
if( !(this.cardNo.equals(cardNo)) || (bal<amnt)) {
throw new Exception("지불이 불가능!!!");
}
return withdraw(amnt);
}
}
Main
위에서 작성한 CheckAccount를 활용하여 메인 프로그램을 작성
public class InheritExam01 {
public static void main(String[] args) {
CheckAccount obj = new CheckAccount("111-222", "홍길동", 0, "555-666");
obj.deposit(100000);
try{
int paidAmnt = obj.pay("555-666", 47000);
System.out.println("지불액: " + paidAmnt);
System.out.println("잔액: " + obj.bal);
}
catch(Exception e) {
e.printStackTrace();
}
}
}
마이너스 통장 계좌 프로그램
CreditAccount 클래스
기본 계좌 Account 클래스를 상속받아 마이너스 통장 기능을 추가한 클래스 작성
public class CreditAccount extends Account { //마이너스 통장
int credit; //마이너스 한도
CreditAccount(String accountNo, String ownName, int bal, int credit){
super(accountNo, ownName, bal);
this.credit = credit;
}
int withdraw(int amnt) throws Exception{
if(amnt > (bal+credit)) //메소드 오버라이딩
throw new Exception("잔액 부족!!!"); //예외를 던짐
bal -= amnt;
return amnt;
}
}
Main
위에서 작성한 CreditAccount를 활용하여 메인 프로그램을 작성
public class InheritExam02 {
public static void main(String[] args) {
CreditAccount obj = new CreditAccount("000-11", "김선달", 10, 2000);
int amnt;
try{
amnt = obj.withdraw(50);
System.out.println("인출액: " + amnt);
System.out.println("잔액: " + obj.bal);
System.out.println("마이너스 한도액: " + obj.credit);
} catch(Exception e){
e.printStackTrace();
}
}
}
포인트 적립 계좌 프로그램
BonusAccount 클래스
기본 계좌 Account 클래스를 상속받아 포인트 적립 기능을 추가한 BonusAccount 클래스 작성
public class BonusAccount extends Account{ //포인트 적립 통장
int bonus;
BonusAccount(String accountNo, String ownName, int bal, int bonus){
super(accountNo, ownName, bal);
this.bonus = bonus;
}
void deposit(int amnt) {
super.deposit(amnt); //상위클래스 Account의 deposit을 호출하여 코드 재활용
bonus += (int)(amnt * 0.001); //메소드 오버라이딩
}
}
Main
위에서 작성한 BonusAccount를 활용하여 메인 프로그램 작성
public class InheritExam03 {
public static void main(String[] args) {
BonusAccount obj = new BonusAccount("333-33", "김미영", 0, 0);
obj.deposit(1000000);
System.out.println("잔액: " + obj.bal);
System.out.println("누적 포인트: " + obj.bonus);
}
}
상위 클래스로 하위 클래스를 선언할 수 있다.
public class InheritExam05 {
public static void main(String[] args) {
Account obj1 = new Account("1-2", "임꺽정", 10000);
Account obj2 = new CheckAccount("4-5", "홍길동", 20000, "5-6");
Account obj3 = new CreditAccount("7-8", "김선달", 30000, 2000000);
Account obj4 = new BonusAccount("0", "김미영", 0, 0);
prtAccount(obj1);
prtAccount(obj2);
prtAccount(obj3);
prtAccount(obj4);
}
static void prtAccount(Account obj) {
System.out.println("계좌 번호: " + obj.accountNo);
System.out.println("계좌주: " + obj.ownName);
System.out.println("잔액: " + obj.bal);
System.out.println();
}
}