04. 은행 계좌 만들기 (4)
1 입금, 출금
2 접근제어자
3 계좌이체
4> 생성자
5 this
4. 생성자
두 클래스에 생성자를 만들어 봅시다.
Person 클래스
Person의 생성자 2개를 만들 것입니다.
(1) 파라미터로 '이름'을 뜻하는 String형 값 pName과 '나이'를 뜻하는 int형 값 pAge를 받고 초기값을 설정합니다. 인스턴스 변수 cashAmount은 0으로 시작합니다. 단, pAge가 음수면 인스턴스 변수 age는 12로 설정합니다.
(2) 파라미터로 '이름'을 뜻하는 String형 값 pName, '나이'를 뜻하는 int형 값 pAge, 그리고 '보유 현금'을 뜻하는 int형 값 pCashAmount를 받고 초기값을 설정합니다. (1)번과 마찬가지로 pAge가 음수인 경우에는 age를 12로 설정합니다. pCashAmount가 음수면 인스턴스 변수 cashAmount를 0으로 설정합니다.
BankAccount 클래스
BankAccount의 생성자 3개를 만들 것입니다.
(1) 파라미터로 '잔액'을 뜻하는 int형 값 pBalance를 받습니다. 파라미터로 받은 잔액은 음수가 될 수 없습니다. 음수 입력이 있을 경우 0으로 설정합니다.
(2) 파라미터로 '소유자'를 뜻하는 Person형 값 pOwner를 받습니다. pOwner를 인스턴스 변수 owner에 지정해주고, 잔액은 0으로 시작합니다.
(3) 파라미터로 '잔액'을 뜻하는 int형 값 pBalance와 '소유자'를 뜻하는 Person형 값 pOwner를 받습니다. 마찬가지로 balance와 owner를 설정해주고, 파라미터로 받은 잔액이 음수인 경우에는 balance를 0으로 설정합니다.
테스트
Main클래스의 main메소드에
- Person의 1번 생성자를 사용해서 인스턴스 p1을 만듭니다. 생성 후 보유 현금은 30000으로 재설정해줍니다.
- Person의 2번 생성자를 사용해서 인스턴스 p2를 만듭니다. 보유 현금 초기값은 100000으로 설정해줍니다.
- BankAccount의 2번 생성자를 사용해서 인스턴스 a1을 만듭니다. 파라미터로 p1을 넘겨줘서 p1과 a1을 연결해줍니다. 생성 후 잔액을 100000으로 재설정해줍니다.
- BankAccount의 3번 생성자를 사용해서 인스턴스 a2을 만듭니다. 파라미터로 p2을 넘겨줘서 p2과 a2을 연결해줍니다. 잔액 초기값은 500000입니다.
위의 지시에 따라 프로그램을 수정하여 오류가 나오지 않도록 하고, 테스트 케이스는 유지하여 이전 문제와 같이 아래의 출력값이 나오도록 해야 합니다.
이 실행결과가 나와야 합니다.
true - from: 말랑이, to: 다람이, amount: 200000, balance: 300000
true - from: 다람이, to: 말랑이, amount: 150000, balance: 150000
true - from: 말랑이, to: 다람이, amount: 270000, balance: 180000
true - from: 다람이, to: 말랑이, amount: 130000, balance: 290000
A. 해설
BankAccount 클래스
public class BankAccount {
private int balance;
private Person owner;
public void setBalance(int newBalance) { balance = newBalance; }
public int getBalanve() { return balance; }
public void setOwner(Person newOwner) { owner = newOwner; }
public Person getOwner() { return owner; }
// 파라미터 : 입금할 액수(정수)
// 리턴 : 성공여부(불린)
boolean deposit(int amount) {
// 입금할 액수가 0보다 작거나 현금보유량보다 클 경우 (실패)
if (amount < 0 || amount > owner.getCashAmount()) {
System.out.println("입금 실패입니다. 잔고: " + balance
+ "원, 현금: " + owner.getCashAmount() + "원");
System.out.println("false");
return false;
// 그 밖의 경우 (성공)
} else {
balance = balance + amount;
owner.setCashAmount(owner.getCashAmount() - amount);
System.out.println(amount +"원 입금하였습니다. 잔고: " + balance
+ "원, 현금: " + owner.getCashAmount() + "원");
System.out.println("true");
return true;
}
}
// 파라미터 : 출금할 액수(정수)
// 리턴 : 성공여부(불린)
boolean withdraw(int amount) {
// 출금할 액수가 0보다 작거나 잔고보다 클 경우 (실패)
if (amount < 0 || amount > balance) {
System.out.println("출금 실패입니다. 잔고: " + balance
+ "원, 현금: " + owner.getCashAmount() + "원");
System.out.println("false");
return false;
// 그 밖의 경우 (성공)
} else {
balance -= amount;
owner.setCashAmount(owner.getCashAmount() + amount);
System.out.println(amount + "원 출금하였습니다. 잔고: " + balance
+ "원, 현금: " + owner.getCashAmount() + "원");
System.out.println("true");
return true;
}
}
public boolean transfer(BankAccount to, int amount) {
boolean success;
if (amount < 0 || amount > balance) {
success = false;
} else {
balance -= amount;
to.balance += amount;
success = true;
}
System.out.println(success + " - from: " + owner.getName()
+ ", to: " + to.owner.getName()
+ ", amount: " + amount
+ ", balance: " + balance);
return success;
}
// account와 account 간의 거래이므로, Person to의 정보를 to의 account 정보로 바꾸어 호출.
public boolean transfer(Person to, int amount) { return transfer(to.getAccount(), amount); }
public BankAccount(int balance) {
if (pBalance < 0) {
balance = 0;
} else {
balance = pBalance;
}
}
public BankAccount(Person owner) {
owner = pOwner;
balance = 0;
}
public BankAccount(int balance, Person owner) {
if (pBalance < 0) {
balance = 0;
} else {
balance = pBalance;
}
owner = pOwner;
}
}
Person 클래스
public class Person {
private String name;
private int age;
private int cashAmount;
private BankAccount account;
public String getName() { return name; }
public void setName(String newName) { name = newName; }
public int getAge() { return age; }
public void setAge(int newAge) { age = newAge; }
public int getCashAmount() { return cashAmount; }
public void setCashAmount(int newCashAmount) { cashAmount = newCashAmount; }
public BankAccount getAccount() { return account; }
public void setAccount(BankAccount newAccount) { account = newAccount; }
// account와 account 간의 거래이므로, 첫째로 BankAccount 클래스의 transfer 메소드를 써야함.
// 둘째로 Person to의 정보를 to의 account 정보로 바꾸어 호출.
public boolean transfer(Person to, int amount) { return account.transfer(to.getAccount(), amount); }
// account와 account 간의 거래이므로, BankAccount 클래스의 transfer 메소드를 써야함.
public boolean transfer(BankAccount to, int amount) { return account.transfer(to, amount); }
public Person(String pName, int pAge) {
if (pAge < 0) {
age = 12;
} else {
age = pAge;
}
name = pName;
cashAmount = 0;
}
public Person(String pName, int pAge, int pCashAmount) {
if (pAge < 0) {
age = 12;
} else {
age = pAge;
}
if (pCashAmount < 0) {
cashAmount = 0;
} else {
cashAmount = pCashAmount;
}
name = pName;
}
}
Main 클래스
public class Main {
public static void main(String[] args) {
// p1 사람 선언
Person p1 = new Person("다람이", 23);
p1.setCashAmount(30000);
// a1 은행 계좌 생성
BankAccount a1 = new BankAccount(p1);
a1.setBalance(100000);
p1.setAccount(a1);
// p2 사람 선언
Person p2 = new Person("말랑이", 21, 100000);
// a2 은행 계좌 생성
BankAccount a2 = new BankAccount(500000, p2);
p2.setAccount(a2);
// 계좌 이체 테스트
a2.transfer(a1, 200000);
a1.transfer(p2, 150000);
p2.transfer(a1, 270000);
p1.transfer(p2, 130000);
}
}
출처 | 코드잇 (자바 기초)
'💠문제 풀이 > Java 문제 풀이' 카테고리의 다른 글
06. 특가 할인 매장 (0) | 2021.10.05 |
---|---|
05. 은행 계좌 만들기 (5) (0) | 2021.10.05 |
03. 은행 계좌 만들기 (3) (0) | 2021.10.05 |
02. 은행 계좌 만들기 (2) (0) | 2021.10.05 |
01. 은행 계좌 만들기 (1) (0) | 2021.09.28 |