출력함수는 사용자에게 보여지도록 만들어진 것이기 때문에 main에서 사용하는 것이 바람직하다.
따라서 부모 클래스인 Account에서 사용한 print문은 주석처리로 바꾸고 balance를 return하여 main에서 print문과 함께 보여지도록 바꾸었다. 그런데 굳이 balanceInfo를 만들지 않고 get으로 접근이 가능할 것 같은데, 시도해 봐야겠다.
* print문은 main함수에서 이용하도록 하자.
package account;
public class Account {
private String accountNo; // 계좌번호
private String ownerName; // 예금주 이름
private int balance; // 잔고
Account(String accountNo, String ownerName, int balance) { // 생성자
this.accountNo = accountNo;
this.ownerName = ownerName;
this.balance = balance;
}
public String getAccountNo() // 계좌번호 조회
{
return accountNo;
}
public void setAccountNo(String accountNo) // 계좌번호 변경
{
this.accountNo = accountNo;
}
public String getOwnerName() // 예금주 이름 조회
{
return ownerName;
}
public void setOwnerName(String ownerName) // 예금주 이름 변경
{
this.ownerName = ownerName;
}
public int getBalance() // 잔고 조회
{
return balance;
}
public void setBalance(int balance) { // 잔고 변경
this.balance = balance;
}
public int balanceInfo() { // 사용자가 잔고를 알 수 있도록 구현하는 메소드 선언
// System.out.println("현재 잔고는 "+balance+"원입니다.");
return balance;
}
public void deposit (int amount) { // "저금한다" 기능을 구현하는 메소드 선언
balance += amount;
}
int withdraw(int amount) throws Exception { // "인출한다" 기능을 구현하는 메소드 선언
if (balance < amount)
throw new Exception("잔액이 부족합니다.");
balance -= amount;
return balance;
}
}
이왕이면 cardNo도 private로 선언하여 접근을 제어해야하는데, 코드를 작성하면서 잊어버렸다.
private과 final의 차이도 알아두면 좋을 것 같았다. private은 접근을 제어하기 때문에 외부 class에서 접근이 불가능하다. final은 초기화된 값을 변경할 수 없도록 하는데, 상수 const와 동일한 기능을 한다.
package account;
// 직불 계좌 클래스
public class CheckingAccount extends Account {
String cardNo; // 카드번호
CheckingAccount(String accountNo, String ownerName, int balance, String cardNo) {
super(accountNo, ownerName, balance); // Account 클래스 생성자 호출
this.cardNo = cardNo;
}
// 카드 번호 오류 혹은 출금하려는 돈이 잔고보다 많은 경우
int pay(String cardNo, int amount) throws Exception {
if(!cardNo.equals(this.cardNo) || (getBalance() < amount))
throw new Exception("지불이 불가능합니다.");
return withdraw(amount);
}
}
InputMismatchException 을 처음 알았다. 예를 들어서 정수를 입력받아야하는데 사용자가 문자나 문자열을 입력했을 때 예외를 처리하는 기능을 한다. 그런데 이것만 이용하면 사용자가 1~4 선택지 외에 5,6 등과 같은 정수형을 선택했을 때에도 그대로 실행된다. 따라서 이러한 경우는 default에서 따로 처리를 해줬고, case 2와 3을 보면 각각 try catch를 한 것이 보인다. 어차피 같은 기능을 구현하기 때문에 반복하여 try-catch문을 작성할 필요없이 뒤에 한번에 작성하면 되는 거였는데 좀 더 보완이 필요해 보인다.
package account;
import java.util.Scanner;
import java.util.InputMismatchException;
public class InheritanceExample {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int money; // 사용자가 입력한 돈
boolean play = true; // 프로그램 종료를 실행시키기 위한 선언
String cardNum; // 사용자가 입력한 카드번호
// 계좌번호, 예금주 이름, 잔고, 카드번호 객체 선언
CheckingAccount obj = new CheckingAccount("000-11-111111", "김선달", 10000, "111-222");
int choice;
while(play) { // play가 true인 동안 반복
try {
System.out.println("해당 번호를 누르세요");
System.out.println("1.저금\n2.인출\n3.카드 지불\n4.종료");
choice = scan.nextInt();
switch(choice) {
case 1 :
System.out.println("저금액 : ");
money = scan.nextInt();
obj.deposit(money);
System.out.println("잔고는 "+obj.balanceInfo()+" 입니다.");
break;
case 2 :
try {
System.out.println("인출액 : ");
money = scan.nextInt();
obj.withdraw(money);
System.out.println("잔고는 "+obj.balanceInfo()+" 입니다.");
}
catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 3 :
try {
System.out.println("카드 번호 : ");
cardNum = scan.next();
System.out.println("카드 지불액 : ");
money = scan.nextInt();
obj.pay(cardNum, money);
System.out.println("잔고는 "+obj.balanceInfo()+" 입니다.");
}
catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 4 :
System.out.println("프로그램 종료");
play = false;
break;
default :
System.out.println("잘못 누르셨습니다.");
break;
}
}
catch(InputMismatchException ime) {
System.out.println("잘못 누르셨습니다.");
scan.next();
choice = 0;
}
}
}
}
'개발' 카테고리의 다른 글
기초 Git 활용 (0) | 2023.06.25 |
---|---|
백엔드 서버 세팅 (0) | 2023.06.10 |
Spring Security + JWT 회원가입/로그인 (Token 발급 받기) (0) | 2023.06.10 |
[Kotlin] ToDoApp (0) | 2022.08.25 |
계좌 관리 프로그램 (0) | 2021.05.10 |