プログラミング

オブジェクト指向のカプセル化についてわかりやすく解説

オブジェクト指向のカプセル化についてわかりやすく解説

本記事ではオブジェクト指向のカプセル化についてなるべくわかりやすく解説しています。

  • カプセル化とは?
  • カプセル化の目的とメリット
  • アクセス制御の種類と定石
  • getterとsetterについて

本記事を読むことでカプセル化にまつわる上記の内容が理解できることでしょう。

ハニ太郎
ハニ太郎
それでは早速オブジェクト指向のカプセル化について解説していくよ♪
オブジェクト指向のクラスとインスタンスについてわかりやすく解説
オブジェクト指向のクラスとインスタンスについてわかりやすく解説オブジェクト指向のクラスとインスタンスについて初心者向けにわかりやすく解説。クラスは設計図。設計図であるクラスから生み出せれた実体がインスタンス。...

カプセル化とは?

カプセル化”とは、データの読み書きやメソッドの呼び出しを制御する機能です。

カプセル化とは

大切なデータを外から簡単に書き換えられるプログラムだと恐ろしいですよね?そんな恐ろしい事態を防ぐための機能がカプセル化になります。

カプセル化とはデータの読み書きやメソッドの呼び出しを制御する機能。 

カプセル化の目的

そんなカプセル化ですが、先ほどのイラストで記した悪意のある不正利用以外にも人間による操作ミスを防止することができます。

カプセル化の目的

つまり、カプセル化の目的は想定しないクラスの利用を防止できることと言えるでしょう。

また、カプセル化により想定しない利用が発生した場合の原因特定がしやすくなります。

カプセル化の目的は想定しないクラスの利用を防止できることと問題が発生した際に原因の特定を容易にすること。

カプセル化による制御の種類と定石

カプセル化の目的については理解できたとして、では一体どのようにカプセル化によるアクセス制御を行なっていけばいいのか?

カプセル化による4つの制御レベル

Javaを例に出すと(他の言語でも大抵同じ)データ・メソッドそれぞれに対して以下4種類からアクセス制御レベルを選択する仕組みです。

private自身のクラスからのみアクセスを許可
package private自身と同じパッケージに属するクラスからのみアクセスを許可
protected自身と同じパッケージに属するか自身を継承した子クラスからのみアクセスを許可
public全てのクラスからのアクセスを許可

これらprivateやpublicなどをアクセス修飾子と呼び、データやメソッドを宣言する際、先頭に記述することでアクセス制御が可能となります。

カプセル化による制御の定石

ただ、上の図だけ見ても「どのアクセス修飾子をどういった場面で使えばいいの?」と思われるかと思います。

ハニ太郎
ハニ太郎
心配はご無用♪お決まりのパターンがあるから安心!

カプセル化を行う際は基本的に以下のような設定にしておくのがベターでしょう。

  • 属性(データ)は全てprivateで保護
  • 操作(メソッド)は全てpublicで公開

あとは必要に応じてアクセス修飾子を微調整していけば問題ないかと思います。

アクセス修飾子にはprivate,publicなどの種類がある。基本的に属性(データ)にprivate、操作(メソッド)にpublicを付与。あとは必要に応じて微調整!

getterとsetterの役割と存在価値

ただ、前章の定石を取り入れるだけだとデータ部分がprivateで保護されているため外部のクラスからアクセスできなくなってしまいます。

カプセル化の仕組み

自分の作っている他のクラスからもデータを参照できなくなると困りますよね?

そこで”getter”と”setter”の出番です。

getterの役割

getterとは、属性(データ)の中身を呼び出し元に返すだけの単純なメソッドです。

カプセル化の仕組み

上の図に示したようにgetterの存在により外部のクラスからgetterを経由してデータの読み込みを行うことができるようになります。

setterの役割

setterとは特定の属性(データ)に指定された値を単に代入するだけのメソッドです。

カプセル化の仕組み

上の図に示したようにsetterの存在により外部のクラスからsetterを経由してデータの書き換えを行うことができるようになります。

getterとsetterの存在価値

getterやsetterという面倒な処理を行っている理由として以下の2点が挙げられます。

  • Read Only・Write Onlyが実現可能
  • クラスの内部設計を自由に行える

Read Onlyを実現したければgetterのみ。(あまり使われないが)Write Onlyを実現したければsetterのみ記述することでアクセス制御を柔軟に行うことができるのです。

カプセル化の仕組み

「クラスの内部設計が自由に行える」というのは上の図に示したように自分の作っているクラスのデータ変数を変更した際に他のクラスに影響を及ぼさないということを意味します。(外部から利用しているメソッド名が変わらないので)

getter・setterを利用することでRead Only、Write Onlyを実現できる。クラスの内部設計も自由に行える。

カプセル化【まとめ】

カプセル化まとめ
  • カプセル化とはデータの読み書きやメソッドの呼び出しを制御する機能。
  • カプセル化の目的は想定しないクラスの利用を防止できることと問題が発生した際に原因の特定を容易にすること。
  • アクセス修飾子にはprivate,publicなどの種類がある。基本的に属性(データ)にprivate、操作(メソッド)にpublicを付与。あとは必要に応じて微調整!
  • getter・setterを利用することでRead Only、Write Onlyを実現できる。クラスの内部設計も自由に行える。
ハニ太郎
ハニ太郎
ここまで記事を読んでいただきありがとうございました♪

本記事がカプセル化の理解促進に少しでもお役に立てたのなら幸いです。

オブジェクト指向を学ぶのにおすすめの本5選
【初心者向け】オブジェクト指向を学ぶのにおすすめの本5選オブジェクト指向を学ぶのにおすすめの本を初心者向けに紹介。どの本も良書なので一冊を繰り返し読み返すことでオブジェクト指向をマスターすることができるでしょう。...
こちらの記事もおすすめ!

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です