基本情報技術者 2016年 秋期 午前(科目A) 問47
問題文
オブジェクト指向におけるカプセル化を説明したものはどれか。
選択肢
ア:同じ性質をもつ複数のオブジェクトを抽象化して、整理すること
イ:基底クラスの性質を派生クラスに受け継がせること
ウ:クラス間に共通する性質を抽出し、基底クラスを作ること
エ:データとそれを操作する手続を一つのオブジェクトにして、データと手続の詳細をオブジェクトの外部から隠蔽すること(正解)
オブジェクト指向におけるカプセル化を説明したものはどれか。【午前2 解説】
要点まとめ
- 結論→カプセル化はデータとそれを操作する手続を一つのオブジェクトにまとめ、その内部実装を外部から隠蔽する設計原則です。
- 根拠→オブジェクト指向の基本概念で、データと振る舞いを結びつけ公開範囲を制御することで変更の影響範囲を小さくします。
- 差がつくポイント→抽象化や継承と混同しないこと。カプセル化は「隠蔽」と「アクセス制御」が本質であり、実装の公開/非公開の扱いが評価点です。
正解の理由
正解は エ です。選択肢エは「データとそれを操作する手続を一つのオブジェクトにして、データと手続の詳細をオブジェクトの外部から隠蔽すること」とあり、カプセル化(情報隠蔽と結合)の定義を正確に表しています。カプセル化はオブジェクト内部にデータ(状態)とメソッド(振る舞い)を内包し、外部に対して公開すべきインタフェースのみを提供することで、実装の変更を外部に影響させにくくします。
よくある誤解
- 抽象化と同じと考える誤解:抽象化は「共通点を取り出して表現すること」であり、カプセル化の目的や手段とは異なります。
- カプセル化=単にprivateにすることだけと考える誤解:private指定は手段の一つに過ぎず、重要なのは「どの情報を隠し、どの操作を公開するか」の設計です。
- カプセル化は継承の反対という誤解:継承は性質や振る舞いを引き継ぐ手段で、カプセル化と目的が競合するわけではありません。併用されることが多い設計原則です。
解法ステップ
- 問題文のキーワードを確認:「データ」「操作」「隠蔽(隠す)」「オブジェクト」などを探す。
- 各選択肢をキーワードと照合し、カプセル化の定義に一致するかを判定する。
- 抽象化(共通化)や継承(性質の受け継ぎ)と混同していないかをチェックし、明確に「隠蔽」を含む選択肢を選ぶ。
選択肢別の誤答解説
- ア: 同じ性質をもつ複数のオブジェクトを抽象化して、整理すること
→ これは「抽象化(あるいは分類)」の説明であり、カプセル化とは異なります。 - イ: 基底クラスの性質を派生クラスに受け継がせること
→ これは「継承(inheritance)」の説明です。カプセル化の説明ではありません。 - ウ: クラス間に共通する性質を抽出し、基底クラスを作ること
→ これも抽象化や継承に関する説明で、カプセル化の本質(隠蔽)を含みません。 - エ: データとそれを操作する手続を一つのオブジェクトにして、データと手続の詳細をオブジェクトの外部から隠蔽すること
→ これが正解です。データと操作の結合と外部からの隠蔽を明確に示しています。
補足コラム
カプセル化の具体例(コード)
- Java の例(アクセス修飾子を使った情報隠蔽):
public class Account {
private double balance; // 外部から直接アクセス不可(隠蔽)
public void deposit(double amount) {
if (amount > 0) balance += amount;
}
public double getBalance() {
return balance;
}
}
- Python の例(慣習による隠蔽、プロパティで公開制御):
class Account:
def __init__(self):
self._balance = 0.0 # 慣習的に非公開
def deposit(self, amount):
if amount > 0:
self._balance += amount
@property
def balance(self):
return self._balance
利点:実装変更時の影響範囲縮小、外部からの不正な状態改変の防止、モジュール性と保守性の向上。設計原則(SOLIDの一部)や低結合・高凝集の実現に寄与します。
FAQ
Q1: カプセル化と情報隠蔽は同じですか?
A1: 実務的にはほぼ同義です。カプセル化は「データと操作をまとめる」ことと「その一部を隠すこと」を含み、情報隠蔽は特に後者(外部に詳細を見せないこと)を強調します。
A1: 実務的にはほぼ同義です。カプセル化は「データと操作をまとめる」ことと「その一部を隠すこと」を含み、情報隠蔽は特に後者(外部に詳細を見せないこと)を強調します。
Q2: getter/setter を使うとカプセル化が損なわれますか?
A2: そのまま無制限に公開するgetter/setterを大量に作ると意味が薄れますが、適切なアクセス制御(読み取り専用、検証付きのsetterなど)を行えばカプセル化は維持されます。
A2: そのまま無制限に公開するgetter/setterを大量に作ると意味が薄れますが、適切なアクセス制御(読み取り専用、検証付きのsetterなど)を行えばカプセル化は維持されます。
Q3: 抽象化や継承とどのように使い分けますか?
A3: 抽象化は「共通性を取り出すこと」、継承は「実装や性質を再利用すること」、カプセル化は「内部を隠し外部に公開すべきインタフェースを制御すること」です。設計では目的に応じて組み合わせます。
A3: 抽象化は「共通性を取り出すこと」、継承は「実装や性質を再利用すること」、カプセル化は「内部を隠し外部に公開すべきインタフェースを制御すること」です。設計では目的に応じて組み合わせます。
関連キーワード: カプセル化、オブジェクト指向、抽象化、継承、ポリモーフィズム、情報隠蔽、アクセス修飾子、SOLID、低結合、高凝集

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

