問題
口座から引き出す機能のみをもったシステムを実装してください。
public class ATM {
public static void main(String[] args) {
BankAccount myAccount = new BankAccount();
myAccount.setWithdrawal(800);//800円を引き落とす。
myAccount.setWithdrawal(-800);//不正に残高を増やそうと試みるw
System.out.println("現在の預金残高:" + myAccount.getBalance() + "円");
}
}
//演算結果
//入力された数値が正しくありません。
//現在の預金残高:9200円
class BankAccount {
//預金残高を保存するプライベートなインスタンス変数balanceを定義
private int balance;
public BankAccount() {
this.balance = 10000;//口座の予算を10000円に設定するコンストラクタ
}
// プライベートなインスタンス変数balanceのgetterメソッド
public int getBalance() {
return this.balance;
}
// プライベートなインスタンス変数balanceのsetterメソッド
public void setWithdrawal(int withdrawal) {
if(withdrawal >= 0) {//不正に残高を増やせないよう対策
this.balance -= withdrawal;
}else {
System.out.println("入力された数値が正しくありません。");
}
}
}
補足
- カプセル化
→private修飾子を使うことで参照したり更新したりできないようにする。 - getter、setter
→名前の通り、privateな変数を参照(get)したり、更新(set)したりするメソッド。もちろんpublicなメソッド。
→どちらかに条件をつけて機能に制限を設けたり、getterだけにして参照しかできないようにしたりできる。
→Eclipseだと自動で作ってくれる機能あり(便利!)
setterに戻り値つけて笑われた
geetterはpublic int getBalance()
のように修飾子の後に戻り値の方を書きます。
setterはpublic void setWithdrawal(int withdrawal)
のようにvoid
をつけて書きます。
ところが私は間違えてpublic int setWithdrawal(int withdrawal)
と書いていました。引数が間違っているのでそもそもコンパイルエラーですが、もし引数名と変数名が同じものでしたらそのまま動きます。しかし講師の方に指摘されたのは「getterいらなくなりません?」
たしかに!!
まあおかげでしっかり覚えられました。w