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();
	}
}