クラスのメンバー変数、メンバーメソッドはだれが触っても良いものと、触るクラスを
限定したい場合もあります。誰が触っても良い物を「public」、自分と同じパッケージ内のクラスから
もしくはサブクラスからしか触れない物を「protected」(C++のproctedとは機能が異なります)、そして
自分自身のクラスからしかさわれない物を「private」と言います。
すべてのメンバー変数、メンバーメソッドをpublicにして、プログラマー達の決め事として
「この変数はパッケージ内のクラスからしか触っちゃダメね」と決めても良いのですが、中には決め事を
守らないプログラマーもいるため、public, protected, privateを決めておけば、文法的に
コンパイラがチェックしてくれます。
なぜ、そんなことをするのでしょう? これは作ったプログラムの一部を部品化しやすいようにです。
オブジェクト指向では、作ったプログラムを部品化しておき、別のプログラムを作る際に再利用できるように
します。例えばインターネットブラウザのプログラムを作った場合、ネットワーク関係の部分は、次に作る
メーラーに再利用ができるわけです。このように部品化したクラスやパッケージは使い方さえ知っていれば
そのソースコードを知らない人でも使うことができます。ところが、内部(ソースコード)を知らないくせに
へんなことをやろうとするプログラマーが出てくるとバグの原因になります。そこで、protectedであれば、
勝手に変な使い方をされなくてすむわけです。
そこで、基本的にメンバー変数はすべてprivateかprotectedにします。そして参照するためのメソッドと
代入するメソッドを用意します。このようなメソッドをアクセサメソッドと呼びます。なぜこんな面倒なことを
するのか、主な理由は3つあります。
1つめはメンバー変数の型を「int」から「double」に変更しようとした場合、参照する場所と、代入
する場所の2つに影響してきます。publicな変数ですと、プログラム全てに渡って、この変数
を参照する場所と代入する場所を探すのは面倒な作業です。それに対して、メソッドを探すのは、
比較的容易だからです。
2つめは、このメンバー変数は他のクラスから参照しても良いけど、値を変更するのは
ダメ、というような変数があったとします。この場合、参照するメソッドはpublicに、代入する
メソッドはprotectedかprivateにすればよいのです。
最後に、マルチスレッドプログラムにした場合です。マルチスレッドプログラムでは、
複数のスレッドが同じ変数にアクセスする場合があります。例えば、あるスレッドがリストを
ソート中に、別のスレッドがそのリストを参照した場合、矛盾が生じてしまいます。
このような場合は、「セマフォ」という、リストを参照する権利を与え、権利があるスレッド
だけがリストを参照したり、いじったりできるようにします。あらかじめ参照するためのメソッドを
用意しておけば、セマフォの処理を組み込む場合も、そのメソッドをちょっと直すだけなので、
簡単です。
このように、変数やメソッドにアクセスするできるクラスを制限することで、あるクラスを
部品のようにすることができます。部品のようになったクラスは別のプログラムを作るときにも
利用できます。例えば、Javaでは標準でGUIや通信mその他さまざまなクラスがたくさん用意されており、
通信をしたいと思えばそのためのクラスを、ファイル操作をしたければそのためのクラスを、
プログラマーが使用するだけですので、プログラムが簡単に書けます。また、携帯電話用の
ソフトを書きたければ、携帯電話会社が公開しているクラス群が利用できるのです。
また、通信をするためのクラスを利用しようと思った場合、通常その中身がどんな
プログラムになっているのか、使う人(プログラマー)は知る必要がありません。つまり
通信をするためのクラスの中身はブラックボックスということになります。
このように、中身を知らなくても部品のように使えるように設計することを
「カプセル化」と言います。