オブジェクト指向には、安全で、壊れにくくて、作りやすくする機能が用意されています。それが「カプセル化」「継承」「ポリモーフィズム」です。今回はその中でもカプセル化について学んでいきましょう。
カプセル化
見せたくないものを隠して、部品として使いやすくする機能。フィールドやメソッドに公開(public)にするか、非公開(private)にするか指定することが出来る。実際にはクラスの外部からアクセスできなくさせる。アクセスするとエラーになるようにする。
カプセル化する方法
公開してもいいものにはフィールドやメソッドの頭に「public」を記述する。逆に公開したくないものには「private」を記述します。これをアクセス修飾子といいます。
アクセス修飾子 | 働き |
private | クラスの内部でアクセスできる。クラスの外部からはアクセスできない。 |
public | クラスの内部でも、クラスの外部からでもアクセスできる |
何も書かない | クラスの内部でも、同じパッケージのクラスからでもアクセスできます。publicに近い形です。 |
public データ型 フィールド名; public 戻り値の型 メソッド名(){ メソッドで行う処理 }
private データ型 フィールド名; private 戻り値の型 メソッド名(){ メソッドで行う処理 }
getter、setterで値を取得したり、書き込む
一般的にJavaではフィールドに直接アクセスできないようになっていますが、フィールドにアクセスできる専用のメソッドがあります。
フィールドの値を読む、読み取り専用のget(ただし書き換えることはできない)
private データ型 フィールド名; public データ型 getフィールド名(){ return フィールド名; }
フィールドに値を書き込むset
private データ型 フィールド名; public void setフィールド名(データ型 引数名){ フィールド名 = 引数名; }
<setterをチェックをかけて使うとき> private データ型 フィールド名; public void setフィールド名(データ型 引数名){ if(条件式){ フィールド名 = 引数名; } }
実演
まずは、フィールドは簡単に書き換えられることを見てみましょう。
自分の名前を言ってあいさつするクラスを作成します。
MyClass.java
次に、Main.javaファイルに最初に実行するクラスを作ります。
Main.java
最初に「関」と命名しましたが、あとからでも命名できて簡単に書き換えられることがわかります。
そこで、カプセルを使います。フィールドをprivateに隠して、読み書きできるメソッドを用意して制限します。制限は「もし、myNameが空っぽだったら名前を書き込める、そうでないなら何もしない」というif文を使います。
MyClass.java
実行してもエラーになります。これは、フィールドをprivateにしたためです。「public void setMyName(~」によってsetterメソッドを使わないと書き込めないようにします。そこでMain.javaファイルを修正します。エラー内容もMain,javaファイルを表示しています。
Main.java
赤線のように変更すれば、あとから命名しても変わらなくできました。
改名用のメソッドを作る
改名用の新しいメソッドを作ることによって、それを選ばないといけなくなるから注意するよね。誤って書き換えるミスをなくすことができます。
出来たらMain.javaファイルに移り、新しく作ったメソッドにアクセスしてみましょう。
改名することができましたね。