은행계좌 코드 만들면서 , 처음에는 금액을 int형을 사용하다가 int형은 근사값이여서 금액을 처리할때는 정확한 BigDecimal () 함수를 사용한다고 합니다.
그래서 다시 int -> BicDecimal 형으로 바꾸는 과정에서
코드상에는 문제가 없어 Main 실행결과
입금, 출금 후 금액이 0원이란 오류를 발견했습니다.
BigDemal() 함수는 일반전인 + , - 연산기호를 사용할 수 없고 별도의 함수가 있어서 였고
BigDecimal result = this.balance.add(amount); // int balance += amount;
이렇게 우측은 BigDecimal 함수에 맞게 변경해주었습니다.
하지만 입출금후 잔금이 0원이다????
그건 바로 !!! 왼쪽의 함수 문제였습니다. !!!
BigDecimal result 은 지역(로컬)변수이기 때문에 한번 입금 및 출금후 사라지는 변수 입니다.
그래서 0원이 됩니다.
이 문제를 해결하기 위해 클래스 변수인 this. Balance 를 사용하였습니다.
public BigDecimal deposit(BigDecimal amount) {
this.balance = this.balance.add(amount); // int balance += amount;
addHistory(ETradeType.DEPOSIT, amount, this.balance, ownerName);
return amount;
}
package bank.controller;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Account {
private String ownerName;
private String accountNumber;
private BigDecimal balance;
private String bankName;
private List<History> histories;
public Account(String ownerName, String accountNumber, String bankName) {
this.ownerName = ownerName;
this.accountNumber = accountNumber;
this.balance = new BigDecimal(0);
this.bankName = bankName;
this.histories = new ArrayList<>();
}
public String getOwnerName() {
return this.ownerName;
}
public String getAccountNumber() {
return accountNumber;
}
public String getAccountNumberWithHypen() {
StringBuilder hypenAttacher = new StringBuilder();
hypenAttacher.append(accountNumber.substring(0, 3));
hypenAttacher.append("-");
hypenAttacher.append(accountNumber.substring(3, 6));
hypenAttacher.append("-");
hypenAttacher.append(accountNumber.substring(6, accountNumber.length()));
return hypenAttacher.toString();
}
public BigDecimal getBalance() {
return this.balance;
}
public String getBankName() {
return this.bankName;
}
public void addHistory(ETradeType type, BigDecimal amount, BigDecimal balance, String traderName) {
History history = new History(OffsetDateTime.now(), this.accountNumber, type, amount, balance, traderName);
histories.add(history);
}
public String printAllHistoriesOrNull() {
StringBuilder historyBuilder = new StringBuilder();
DecimalFormat decimalFormatter = new DecimalFormat("0.##");
for (int i = 0; i < histories.size(); i++) {
History singleHistory = histories.get(i);
historyBuilder.append(String.format("%d. %s, %s, ", i + 1, singleHistory.getTraderName(),
singleHistory.getTypeByString()));
// 만약 거래 금액이 0보다 크다면!
if (singleHistory.getAmount().compareTo(BigDecimal.ZERO) > 0) {
historyBuilder.append(String.format("+%s원", decimalFormatter.format(singleHistory.getAmount())));
} else {
historyBuilder.append(String.format("%s원", decimalFormatter.format(singleHistory.getAmount())));
}
historyBuilder.append(String.format("[%s]%s", singleHistory.getTransactionDate(), System.lineSeparator()));
}
return historyBuilder.toString();
}
public String printHistory(int index) {
StringBuilder historyBuilder = new StringBuilder();
DecimalFormat decimalFormatter = new DecimalFormat("0.##");
History targetHistory = histories.get(index - 1);
historyBuilder.append(String.format("%s%s", targetHistory.getTransactionDate(), System.lineSeparator()));
historyBuilder.append(String.format("거래금액: %s%s", decimalFormatter.format(targetHistory.getAmount()),
System.lineSeparator()));
historyBuilder.append(String.format("거래후 잔액: %s%s", decimalFormatter.format(targetHistory.getBalance()),
System.lineSeparator()));
historyBuilder.append(String.format("거래유형: %s", targetHistory.getTypeByString()));
return historyBuilder.toString();
}
public void editAccount(String newOwnerName, String newAccountNumber, String newBankName) {
this.ownerName = newOwnerName;
this.accountNumber = newAccountNumber;
this.bankName = newBankName;
}
public BigDecimal withdraw(BigDecimal amount) {
if (this.balance.compareTo(amount) < 0) {
return BigDecimal.ZERO;
} else {
this.balance = this.balance.subtract(amount);
addHistory(ETradeType.WITHDRAW, amount, this.balance, ownerName);
return amount;
}
}
// public BigDecimal deposit(BigDecimal amount) {
// this.balance = this.balance.add(amount);
// addHistory(ETradeType.DEPOSIT, amount, this.balance, ownerName);
// return amount;
// }
public BigDecimal deposit(BigDecimal amount) {
this.balance = this.balance.add(amount); // int balance += amount;
addHistory(ETradeType.DEPOSIT, amount, this.balance, ownerName);
return amount;
}
}