FE EXAM

カプセル化(内部を隠して窓口だけ公開)

データと操作を1つにまとめ外部から内部を隠す仕組み。

DIAGRAM
隠された内部データ
公開された窓口
直接アクセス禁止
BankAccount オブジェクト外側の殻(カプセル)が内部を包み込む公開された窓口(メソッド)deposit(金額) 入金withdraw(金額) 出金getBalance() 残高照会隠された内部データ(private)balance = 50000外部から直接は見えない・触れない窓口の中で値をチェックしてから更新する外部の利用者窓口を通して操作deposit(1万)OK ✓外部の利用者内部を直接いじろうとするbalance = -999禁止内部データは隠し、決められた窓口(メソッド)経由でしか操作させないこれが「カプセル化」と「情報隠蔽」
解説

📌
カプセル化とは

殻でデータと操作を包むデータ操作1つの「殻」にまとめる

カプセル化とは、関連するデータ(属性)とそれを扱う操作(メソッド)を1つのオブジェクトにまとめ、外部から内部を直接触れないように隠す仕組みのことです。「カプセル=中身を包む殻」と考えると分かりやすいです。

外部からは、オブジェクトが公開している窓口(メソッド)を通してしか操作できません。中のデータに直接手を出すことはできないようにしておきます。

身近な例で考えると、銀行のATMに似ています。あなたは金庫(内部データ)を直接開けられず、「入金」「出金」というボタン(窓口)を通してだけお金を動かせます。上の図解で、窓口経由はOK・直接アクセスは禁止される様子を確認してください。

📌
情報隠蔽の意味

窓口で値をチェックしてから更新外部の要求窓口値のチェック内部データ正しい値だけが内部に届く

カプセル化の中心にある考え方が情報隠蔽(=オブジェクトの内部の作りを外部から隠すこと)です。内部データを外部から見えない(触れない)状態にし、決められた窓口を通してしか操作させません。

内部データにはprivate(=そのクラスの中からしか使えない、という指定)を付けて隠します。外部に見せたい操作だけにpublic(=どこからでも使える、という指定)を付けて公開します。

情報隠蔽には、主に次の役割があります。
不正な値を防ぐ:窓口の中で「マイナスの残高は許さない」などのチェックをしてから更新できる
内部の変更を外に隠す:データの持ち方を変えても、窓口の使い方が同じなら外部に影響しない
使い方を分かりやすくする:外部は公開された窓口だけ覚えればよい

📌
利点

内部を変えても窓口が同じなら影響なし窓口(変えない)deposit / withdraw内部(変えてOK)データの持ち方外部の利用者は何も書き換えなくてよい

カプセル化によって、プログラムには大きく次のような利点が生まれます。


安全性が高まる:外部から内部データを勝手に書き換えられず、不正な値の混入を防げます
保守しやすい:内部の作りを変えても、窓口の使い方さえ同じなら外部のプログラムに影響しません
使いやすい:利用者は内部の細かい仕組みを知らなくても、公開された窓口だけ覚えれば使えます
整合性を保てる:窓口の中で値のチェックを行えるので、データが常に正しい状態に保たれます

身近な例で考えると、自動販売機のようなものです。利用者はお金を入れてボタンを押すだけ。中の在庫管理やお釣りの計算(内部)がどう変わっても、使う側は同じ操作のままで済みます。これがカプセル化のうれしさです。

📌
なぜカプセル化が必要か

カプセル化なしbalance直接アクセス可ユーザAユーザB不正値が入る危険カプセル化あり窓口メソッド値チェック済みユーザAユーザB安全に更新できるVS

カプセル化が必要な理由は、データを「むき出し」にすると誰でも自由に書き換えられ、プログラムが壊れやすくなるからです。たとえば銀行残高(balance)に直接アクセスできる状態だと、balance = -99999 のような不正な値が誰でも書き込めてしまいます

カプセル化して窓口(メソッド)経由にすれば、窓口の中で「マイナスになるなら拒否する」などのルールを入れられます。つまりカプセル化とは、データを守るための「門番」を置く仕組みです。
カプセル化なし:データがむき出し → 誰でも直接いじれる → バグや不正値が混入しやすい
カプセル化あり:窓口を通す → 門番がチェック → 正しい値だけが内部に届く

たとえば、コンビニのレジを想像してください。お客さんが直接レジの中に手を入れてお釣りを取ることはできません。店員(窓口)を通すことで、金額が正しく管理されます。カプセル化もまったく同じ考えです。

📌
OOP3要素の中でのカプセル化の位置づけ

カプセル化データを隠して窓口で守る継承親の性質を子が引き継ぐ多態性同じ呼び出しで違う動作をするオブジェクト指向(OOP)3つ合わさって「再利用しやすく・壊れにくい」設計ができる

カプセル化は、オブジェクト指向プログラミング(OOP)の3大要素のうちの1つです。残り2つは継承(既存クラスの性質を子クラスが引き継ぐ仕組み)と多態性(ポリモーフィズム)(同じ呼び出しで型ごとに違う動作をさせる仕組み)です。

3つの中でカプセル化が担う役割は「データと操作を安全にまとめる土台」です。継承でクラスを再利用したり、多態性で柔軟な呼び出しをしたりするには、まず個々のオブジェクトが正しい状態を保っている必要があります。カプセル化はそれを保証する最初の砦(とりで)です。
カプセル化:データを守り、各オブジェクトを健全な状態に保つ
継承:共通部分を親クラスにまとめてコードを再利用する
多態性:型ごとの動作を統一した呼び出しで扱い、拡張しやすくする

練習問題

🎯
基本情報技術者 練習問題

Q1.オブジェクト指向における「カプセル化」の説明として最も適切なものはどれか。
A.データと操作を1つにまとめ、外部から内部を直接触れないように隠すこと
B.親クラスの性質を子クラスが受け継ぐこと
C.同じ呼び出しが型によって異なる動作をすること
D.複数のクラスを1つのファイルに保存すること
Q2.カプセル化における「情報隠蔽」によって実現されることはどれか。
A.プログラムの実行速度が必ず2倍になる
B.オブジェクトの内部データへ外部が直接アクセスできなくなり、不正な値の混入を防げる
C.すべての属性を外部から自由に書き換えられるようになる
D.クラスを継承できなくなる
Q3.カプセル化の利点として適切でないものはどれか。
A.内部の作りを変えても、外部の使い方が変わらなければ影響が及ばない
B.不正な値が入らないようチェックして整合性を保てる
C.利用者は内部の細かい仕組みを知らなくても使える
D.外部からすべての内部データを直接書き換えられる

関連コンテンツ