本記事ではオブジェクト指向の「カプセル化とは」というオブジェクト指向の基礎ついて初学者向けになるべくわかりやすく解説しています。
【公式HP】https://flxy.jp/
- 90%以上がフルリモート案件
- 週1〜3日程度の副業向け案件が多い
- 自身のライフスタイルに合った働き方ができる
- 希望に合わせてコーディネーターが最適な提案をしてくれる
- 定期開催される交流会や勉強会で人脈を広げることができる
\ 最短60秒で登録可能! /
目次
オブジェクト指向におけるカプセル化とは?わかりやすく解説
カプセル化とは、データの読み書きやメソッドの呼び出しを制御する機能です。
大切なデータを外から簡単に書き換えられるプログラムだと恐ろしいですよね?そんな恐ろしい事態を防ぐための機能がカプセル化になります。
カプセル化とはデータの読み書きやメソッドの呼び出しを制御する機能。
カプセル化の目的についてわかりやすく解説
そんなカプセル化ですが、先ほどのイラストで記した悪意のある不正利用以外にも人間による操作ミスを防止することができます。
つまり、カプセル化の目的は想定しないクラスの利用を防止できることと言えるでしょう。また、カプセル化により想定しない利用が発生した場合の原因特定がしやすくなります。
カプセル化の目的は想定しないクラスの利用を防止できることと問題が発生した際に原因の特定を容易にすること。
カプセル化による制御の種類と定石
カプセル化の目的については理解できたとして、では一体どのようにカプセル化によるアクセス制御を行なっていけばいいのか?
カプセル化による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を実現できる。クラスの内部設計も自由に行える。
ここまで記事を読んでいただきありがとうございました。本記事がカプセル化の理解促進に少しでもお役に立てたのなら幸いです。また、当ブログでは他にもオブジェクト指向に関する記事を公開しているので、気になる記事がないか併せて確認してみてください。
- 90%以上がフルリモート案件
- 週1〜3日程度の副業向け案件が多い
- 自身のライフスタイルに合った働き方ができる
- 希望に合わせてコーディネーターが最適な提案をしてくれる
- 定期開催される交流会や勉強会で人脈を広げることができる
\ 最短60秒で登録可能! /
とても分かりやすい記事、ありがとうございます!
『private』、についてよろしければ教えていただきたいのですが、
僕は今、なぜ『private』でクラスの外からアクセスできなくしたものをわざわざ『ゲッター』や『セッター』を使ってアクセスできるようにしてるのかが理解できていません。
僕の予想では『private』で保護している物を簡単に変更できないように手間をかけさせるために『ゲッター』や『セッター』を使っているのかな?と思っています。この予想で合っているのでしょうか?
コメントありがとうございます(^^)
>>なぜ『private』でクラスの外からアクセスできなくしたものをわざわざ『ゲッター』や『セッター』を使ってアクセスできるようにしてるのかが理解できていません。
わざわざ属性をprivateしてまどろっこしいgetterやらsetterを追加する理由とは?ということですね。
理由としては①クラス内部の変更容易性、②トレース容易性が挙げられるかと思います。
①変更容易性・・・例えばクラスの属性名を変更したくなった場合、getterとsetterからのみの参照だとわかっていればその部分のコードのみ修正すれば良い。一方で外部のクラスからも変更したいクラスの属性名を直接参照している場合は・・・?結構修正箇所が多くて大変になっちゃいます(^^)
②トレース容易性・・・getterとsetterからのみ参照できる方が証跡を追いやすい。他のクラスからも参照し放題だと何かあった時に問題を追いづらくなってしまうのです・・・。
オブジェクト指向は奥が深いので以下の記事でも紹介していますが、良書を一冊読んで体系的に理解しておくのが近道だと思いますよ♪
https://engineer-life.dev/object-orientation-books/
返信ありがとうございます!こんなに早く丁寧に返信して頂けると思っていませんでした!
本まで紹介いていただいて!
『オブジェクト指向でなぜつくるのか』読んで勉強していきます!
今後もハニ太郎さんのブログ読ましていただきます!
ファイトです٩( ‘ω’ )و
はい、是非お願いします!