プログラミング応用a 第9回 『モジュール化その1 (メンバアクセス制御とアクセッサ)』 |
9-5 【メンバのprivate指定】
●クラスのメンバを,他のクラスのイタズラから守るには,メンバを private 指定してやれば良い(下図)。
この private のように「メンバやクラス」へのアクセスを制御するキーワードを「アクセス修飾子」と呼ぶ。
●実際に, Person クラスや Meibo クラスのメンバを private 指定してみよう(下図)。
改良版Meibo.java
このように,フィールドをprivate指定した場合,AttackMeibo.javaの5行目
m.num = 10;
という部分は,コンパイル時に以下のようなメッセージを出してエラーになる。
これは,Meiboクラスの num フィールドが private 指定されているので, AttackMeiboクラスのメンバからはアクセスできないからである(上図右下)。
|
●一難去ってまた一難?
Miboクラスの全フィールドを private に指定したので, Miboクラスの全フィールドは勝手にアクセスされることはなくなった。
同様に,Personクラスの全フィールドも private 指定されているので, Personクラスの外から勝手にアクセスされることは無い。
しかし,まだ問題が残っている。Person の age, gender, name フィールドを private にしたため, Meibo クラスの printAll( ) メソッ
ドで,これらの private なフィールド
pa[i].age,pa[i].gender,pa[i].name
にアクセスしようとしているところ(Meibo.javaの36行目)も以下のようなメッセージを出してコンパイルエラーになってしまう
のである(!)。
|
つまり,次のような矛盾が起こっているのである。
・Personクラスとしては,全フィールドを外部からの意図しないアクセスから守るにはprivateにしなければならない
・一方,Meiboクラスは,Person型の各フィールド値を表示するためにそれらのフィールドのアクセスしなければならない
このように,クラスの外部から privateなフィールドにアクセスする必要があるときは,どうすればよいのだろうか?
実は,後述する「アクセッサ」というフィールドにアクセスするための専用のメソッドを用意することで解決できる。
アクセッサについて解説する前に,クラスのメンバが公開部分と非公開部分に分かれる意味を確認しておこう。