プログラミング応用a 第9回 『モジュール化その1 (メンバアクセス制御とアクセッサ)』  

9-5 【メンバのprivate指定】

●クラスのメンバを,他のクラスのイタズラから守るには,メンバを private 指定してやれば良い(下図)。
 この private のように「メンバやクラス」へのアクセスを制御するキーワードを「アクセス修飾子」と呼ぶ。



●実際に, Person クラスや Meibo クラスのメンバを private 指定してみよう(下図)。

改良版Meibo.java

このように,フィールドをprivate指定した場合,AttackMeibo.javaの5行目
  m.num = 10;
という部分は,コンパイル時に以下のようなメッセージを出してエラーになる。
これは,Meiboクラスの num フィールドが private 指定されているので, AttackMeiboクラスのメンバからはアクセスできないからである(上図右下)。

AttackMeibo.java:5: num は Meibo で private アクセスされます。
 m.num = 10; // 登録数をむりやり上限値に設定してしまう
  ^
この下にもエラーメッセージが続くが,それは次節で説明する

フィールドは,他のクラス(とそのオブジェクト達)から勝手に値をいじられないように, private 指定しておくこと。これはオブジェクト指向プログラミングの常識である.



●一難去ってまた一難?

 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行目)も以下のようなメッセージを出してコンパイルエラーになってしまう
のである(!)。

./Meibo.java:36: age は Person で private アクセスされます。
if( pa[i] != null ) System.out.println( pa[i].age + ", " + pa[i].gender + ", " + pa[i].name );
                                              ^
./Meibo.java:36: gender は Person で private アクセスされます。
if( pa[i] != null ) System.out.println( pa[i].age + ", " + pa[i].gender + ", " + pa[i].name );
                                                                 ^
./Meibo.java:36: name は Person で private アクセスされます。
if( pa[i] != null ) System.out.println( pa[i].age + ", " + pa[i].gender + ", " + pa[i].name );
                                                                                       ^

つまり,次のような矛盾が起こっているのである。
 ・Personクラスとしては,全フィールドを外部からの意図しないアクセスから守るにはprivateにしなければならない
 ・一方,Meiboクラスは,Person型の各フィールド値を表示するためにそれらのフィールドのアクセスしなければならない
このように,クラスの外部から privateなフィールドにアクセスする必要があるときは,どうすればよいのだろうか?

 実は,後述する「アクセッサ」というフィールドにアクセスするための専用のメソッドを用意することで解決できる。

アクセッサについて解説する前に,クラスのメンバが公開部分と非公開部分に分かれる意味を確認しておこう。


【公開と非公開の意味】

●下図のように,モジュールの公開部分は外部とのインタフェイス(interface)の役目を果たす(インタフェイス部)。
●また,モジュールの非公開部分は外部からは隠され,実装部と呼ばれる。

※つまり,モジュールには,実装部分とインタフェイス部分が自然と生まれるのである。
※逆に言うと,モジュールを作ったつもりでも,どの部分が実装部分か,どの部分がインタフェイス部分かを意識して作らないと,モジュールを作成したことにはならない。
※インターフェイス部分は他者がこのモジュールを利用する際に直接アクセスする部分なので,その仕様を頻繁に変更してはならない 。
※逆に,実装部分は外部から隠されているので,比較的自由に変更が可能である。

【問い】
・車や携帯電話など,身近の工業製品のインタフェイス部分と実装部分を具体例を挙げて示せ。それらのインタフェイス部分が変更されたらどう困るかを
 議論せよ(例:車のアクセルペダルとブレーキペダルが左右逆になったら?等)。
・自然界の動物にも,インタフェイス部分と実装部分がある。たとえば,脳や内臓は外部から勝手にいじられないように外部からは隠されている。
 では,自然界の動物のインタフェイス部分に相当する物は何か。具体例をあげよ。


次に進む