プログラミング PR

【超入門】オブジェクト指向のカプセル化とは?わかりやすく解説

capsule
記事内に商品プロモーションを含む場合があります

本記事ではオブジェクト指向の「カプセル化とは」というオブジェクト指向の基礎ついて初学者向けになるべくわかりやすく解説しています。

エンジニアの副業におすすめ!

エンジニア、デザイナー向けの週2、3日のお仕事紹介【ITプロパートナーズ】【公式HP】https://itpropartners.com/

  • 週3日〜の案件を数多く扱っている
  • エンド直ゆえに高単価案件が多い
  • フルリモート案件など、柔軟な働き方に対応した案件が多い
  • トレンド技術を取り入れた魅力的な案件が豊富にある
  • 専属エージェントが希望に沿った案件を紹介してくれる

\ 最短60秒で登録可能! /
無料会員登録
案件を探す

engineer-sidejob-agent
【土日リモート可】エンジニアにおすすめの副業エージェント21選エンジニアにおすすめの副業エージェントは?本記事では数ある副業案件を扱うエージェントの中から現役エンジニアである筆者が厳選して21社紹介しております。副業に興味のあるエンジニアは要チェックです。...

オブジェクト指向におけるカプセル化とは?わかりやすく解説

search

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

カプセル化とは

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

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

カプセル化の目的についてわかりやすく解説

engineer

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

カプセル化の目的

つまり、カプセル化の目的は想定しないクラスの利用を防止できることと言えるでしょう。また、カプセル化により想定しない利用が発生した場合の原因特定がしやすくなります。

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

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

good-money

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

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

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

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

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

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

ただ、上の図だけ見ても「どのアクセス修飾子をどういった場面で使えばいいの?」と思われるかと思います。カプセル化を行う際は基本的に以下のような設定にしておくのがベターでしょう。

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

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

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

getterとsetterの役割と存在価値

graph

ただ、前章の定石を取り入れるだけだとデータ部分が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を実現できる。クラスの内部設計も自由に行える。
たろう
たろう
ここまで記事を読んでいただきありがとうございました♪

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

また、当ブログでは他にもオブジェクト指向に関する記事を公開しているので、気になる記事がないか併せて確認してみてください。

object-pic
【2024年最新】オブジェクト指向のおすすめ本5選オブジェクト指向を学ぶのにおすすめの本を初心者向けに紹介。どの本も良書なので一冊を繰り返し読み返すことでオブジェクト指向をマスターすることができるでしょう。...
object
【初心者向け】オブジェクト指向とは?わかりやすく解説オブジェクト指向とは?という疑問に対して初心者向けにわかりやすく解説しました。オブジェクト指向とは部品化の考え方を指し、人間が把握しきれない複雑さを克服する手助けをしてくれるものです。...
shukatu
【新卒】ITエンジニア志望の学生におすすめ就活サイト・エージェント10選エンジニア志望だがIT企業の探し方がよくわからないし、就活を有利に進めるためのサポートを受けたい。そんな学生におすすめしたいのが新卒就活サイト・エージェント。本記事では新卒就活サイト・エージェントの中でも特におすすめしたいものを厳選して紹介しております。...
second-new-graduate-engineer
【第二新卒向け】未経験からエンジニアを目指す人におすすめの転職エージェント5選本記事ではそんな数ある転職エージェントの中でも特に、第二新卒で未経験からエンジニアを目指す人におすすめの転職エージェントを厳選して5社紹介していきたいと思います。...
engineer-market-value-diagnosis
【3分でできる】エンジニアとしての市場価値診断エンジニアとしての市場価値を診断するには?本記事ではエンジニアにとって市場価値を把握しておくことの重要性や市場価値診断ツールの紹介などしております。...
engineer-sidejob-agent
【土日リモート可】エンジニアにおすすめの副業エージェント21選エンジニアにおすすめの副業エージェントは?本記事では数ある副業案件を扱うエージェントの中から現役エンジニアである筆者が厳選して21社紹介しております。副業に興味のあるエンジニアは要チェックです。...
freelance-engineer-agent
【2024年最新】フリーランスエンジニアにおすすめのエージェント17選独立後に案件を安定的に獲得できるか不安・・・。そんなエンジニアの方におすすめなのがフリーランスエージェントです。本記事では数あるエージェントの中でも特におすすめしたいエージェントを7社ご紹介いたします。...
こちらの記事もおすすめ!

POSTED COMMENT

  1. 1年育休男 より:

    とても分かりやすい記事、ありがとうございます!
    『private』、についてよろしければ教えていただきたいのですが、
    僕は今、なぜ『private』でクラスの外からアクセスできなくしたものをわざわざ『ゲッター』や『セッター』を使ってアクセスできるようにしてるのかが理解できていません。
    僕の予想では『private』で保護している物を簡単に変更できないように手間をかけさせるために『ゲッター』や『セッター』を使っているのかな?と思っています。この予想で合っているのでしょうか?

    • ハニ太郎 より:

      コメントありがとうございます(^^)
      >>なぜ『private』でクラスの外からアクセスできなくしたものをわざわざ『ゲッター』や『セッター』を使ってアクセスできるようにしてるのかが理解できていません。
      わざわざ属性をprivateしてまどろっこしいgetterやらsetterを追加する理由とは?ということですね。
      理由としては①クラス内部の変更容易性、②トレース容易性が挙げられるかと思います。
      ①変更容易性・・・例えばクラスの属性名を変更したくなった場合、getterとsetterからのみの参照だとわかっていればその部分のコードのみ修正すれば良い。一方で外部のクラスからも変更したいクラスの属性名を直接参照している場合は・・・?結構修正箇所が多くて大変になっちゃいます(^^)
      ②トレース容易性・・・getterとsetterからのみ参照できる方が証跡を追いやすい。他のクラスからも参照し放題だと何かあった時に問題を追いづらくなってしまうのです・・・。
      オブジェクト指向は奥が深いので以下の記事でも紹介していますが、良書を一冊読んで体系的に理解しておくのが近道だと思いますよ♪
      https://engineer-life.dev/object-orientation-books/

  2. 1年育休男 より:

    返信ありがとうございます!こんなに早く丁寧に返信して頂けると思っていませんでした!
    本まで紹介いていただいて!
    『オブジェクト指向でなぜつくるのか』読んで勉強していきます!
    今後もハニ太郎さんのブログ読ましていただきます!

1年育休男 へ返信する コメントをキャンセル

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