本記事ではオブジェクト指向で重要な概念である『カプセル化』の解説をします。
カプセル化とは
ここではカプセル化について解説していきます。
カプセル化(概念)とは
開発ではオブジェクトを操作するプログラマーは、詳細な構造や仕組みを知らなくても、そのオブジェクトは「何ができるのか、どう使うのか」を知っていればよいことが多いです。
例えば、『配列』というオブジェクトがあるが、プログラマーの中にその配列の中身を知っている人はほとんどいないかと思う。
しかし、「配列は複数の値を扱うことができるオブジェクトで、値の格納や要素数はどう取得するか」は知っているかと思う。
そして、正しく使えば、求めた処理をしてくれるから問題ない。
オブジェクト指向プログラミング(C#・javaなど)では、複雑なことは全てオブジェクトの中に隠すことができます。
そして、そのオブジェクトを操作する開発者は、詳細な構造や仕組みを知らなくても、そのオブジェクトを扱うことができるようにするのが『カプセル化』なのです。
つまり、開発者が決めた使い方に沿ってプロパティを扱えるようにするのが『カプセル化』ということです。
カプセル化(具体的)とは
上での説明は概念的な考え方の説明です。
次に具体的なカプセル化の説明になります。
カプセル化のポイントは下の2つです。
・関連のあるデータとそのデータに関する操作をひとまとめにし、外部からデータ操作をできなくする(禁止する)
・外部での操作の仕様のみを開示する
そして、カプセル化は”メンバ変数やメンバメソッドを他のクラスからアクセスできないようにする”で実現できてしまいます。
つまり、メンバ変数やメンバメソッドに『修飾子private』を用いるということです。
修飾子の説明・public:全てのクラスからアクセス可能
・protected:宣言したクラスまたは派生クラスからのみアクセス可能
・private:宣言したクラスのみアクセス可能
カプセル化のメリット
カプセル化の主なメリットは下の通りです。
・オブジェクト自体の仕様を知っているだけで扱えるようになる。
・データ(フィールド)とそのデータに関連する処理(メソッド)がひとまとまりになっていることから、処理の理解しやすさと修正時の影響の局所化ができる。
クラスをカプセル化することで、元々備わっているオブジェクトやメソッドなどと同様に、そのオブジェクト内のプロパティや処理などを理解せずに扱うことができるようになります。
加えて、カプセル化をすることで、あらゆる箇所に影響を与える処理とは違い、修正時の楽さとよいせぬエラーを生じづらくできます。
カプセル化の具体例(参考コード)
ここで使うカプセル化を実施したクラスは下の通りです。
下では「プロパティname」と「外部クラスからプロパティnameに値を代入するSetNameメソッド」「外部クラスでプロパティnameの値を取得するGetNameメソッド」を記述しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Person { private string name; public void SetName(string name) { this.name = name; } public string GetName() { return this.name; } } |
上のクラスを呼び出すクラスは下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using System; namespace sample { class Program { static void Main() { var person = new Person(); person.SetName("田中太郎"); Console.WriteLine(person.GetName()); } } } |
9行目:プロパティを含むクラス「Pesornクラス」をインスタンス化
10行目:「田中太郎」をいう値をPesornクラスのnameプロパティにセット
12行目:Pesornクラスのnameプロパティをコマンドプロンプトに表示
スポンサーリンク