オブジェクト指向プログラミングを学ぶと、カプセル化・継承・ポリモーフィズム(多態性)という3つの重要な考え方が登場します。しかし、カプセル化について「privateを付けて外部から直接変更できないようにすること」とだけ覚えていると、試験問題で出てくる「内部データ構造やメソッドの実装を変更しても、ほかのオブジェクトが影響を受けにくい」という説明が理解しにくく感じることがあります。
この記事では、カプセル化の本来の目的を整理しながら、なぜこの効果が正解になるのか、継承やポリモーフィズムとの違いも含めて解説します。
カプセル化とは単にデータを隠すことではない
カプセル化という言葉を聞くと、private修飾子を使って変数を隠すことを思い浮かべる人が多いです。これは間違いではありませんが、カプセル化の目的は「隠すこと」そのものではありません。
カプセル化の本質は、オブジェクトの内部の仕組みを外部から直接利用させず、決められた操作方法(インターフェース)だけを公開することで、内部と外部の依存関係を減らすことです。
例えば、銀行口座を表すAccountクラスがある場合、残高というデータを外部から直接変更できるようにすると、「残高をマイナスにする」「不正な金額を設定する」といった問題が発生します。そのため残高をprivateにし、入金や出金というメソッドを通して操作します。
なぜ「内部データ構造や実装を変更しても影響を受けにくい」が正解なのか
カプセル化によって内部の仕組みを隠すと、外部のオブジェクトは内部処理を知る必要がなくなります。そのため、内部のプログラムを変更しても、外部への影響を小さくできます。
例えば、商品情報を管理するProductクラスがあり、外部から「価格を取得する」という操作だけを提供しているとします。内部では価格を整数で保存していたものを、後から税率計算用の別のデータ構造に変更しても、外部のプログラムはgetPrice()のような公開されたメソッドを使っている限り修正する必要がありません。
つまり、カプセル化によって「内部の変更」と「外部の利用部分」を分離できるため、他のオブジェクトが影響を受けにくくなるのです。
privateでデータを隠すことと内部変更への強さの関係
privateを使う目的は、単純に「外から見えなくする」ことではありません。外部から直接アクセスできないようにすることで、内部の管理方法を自由に変更できるようになります。
例えば、以下のような違いがあります。
| カプセル化なし | カプセル化あり |
|---|---|
| 外部が変数を直接操作する | メソッドを通して操作する |
| 内部構造を変更すると外部も修正が必要 | 内部だけ変更すればよい |
| データの不正な変更が起きやすい | ルールに沿った操作ができる |
このように、privateによる情報隠蔽は、結果として「内部変更の影響を抑える」という効果につながっています。
他の選択肢がカプセル化ではない理由
問題に出てくる他の選択肢は、オブジェクト指向の別の特徴を説明しています。
イ:ユーザー定義型を追加できる
既存の型に加えて新しい型を作成し、問題領域に合わせて拡張できるという説明は、主にオブジェクト指向の「抽象化」や「型の拡張」に関係する内容です。カプセル化の効果ではありません。
ウ:親クラスの属性を子クラスが利用できる
これは「継承」の説明です。親クラスの共通部分を子クラスが引き継ぐことで、コードの再利用ができます。
エ:同じメッセージでもオブジェクトによって動作が変わる
これは「ポリモーフィズム(多態性)」の説明です。同じメソッド呼び出しでも、対象となるオブジェクトによって異なる処理を実行できる仕組みです。
カプセル化・継承・多態性の違いを整理する
オブジェクト指向の3大要素は、それぞれ役割が異なります。
| 概念 | 目的 |
|---|---|
| カプセル化 | 内部の詳細を隠し、変更の影響を減らす |
| 継承 | 既存クラスの特徴を引き継ぎ再利用する |
| 多態性 | 同じ操作で異なる振る舞いを実現する |
試験問題では、この3つの違いを理解しているかを確認するために似たような選択肢が並べられることが多くあります。
「データを隠す」という表面的な理解だけではなく、「なぜ隠すのか」「隠すことで何が便利になるのか」まで理解すると、問題文の意味が読み取りやすくなります。
まとめ
オブジェクト指向におけるカプセル化は、privateを使ってデータを隠すことだけを意味するものではありません。
重要なのは、オブジェクトの内部実装を外部から切り離し、内部構造を変更しても利用している側への影響を少なくすることです。
そのため、「オブジェクトの内部データ構造やメソッドの実装を変更しても、ほかのオブジェクトがその影響を受けにくい」という選択肢がカプセル化の効果として正解になります。privateによる情報隠蔽は、その目的を実現するための具体的な手段の一つと考えると理解しやすくなります。


コメント