対象試験と出題頻度

カプセル化(Encapsulation)は、基本情報技術者・応用情報技術者で出題されるテーマです。

オブジェクト指向の基本概念を問う問題の定番として、「継承(インヘリタンス)」「多態性(ポリモーフィズム)」「抽象化」との違いを正確に区別できるかがポイントになります。

詳細をクリックして確認
対象試験:
基本情報技術者
応用情報技術者
出題頻度:
★★★☆☆
ランクB(標準)覚えておくと有利

用語の定義

情報処理試験を勉強していると、「カプセル化って結局何をしているの?」と戸惑う方は多いです。

カプセル化(Encapsulation)とは、一言で言うと

 「データとそのデータを操作するメソッドを一つにまとめ、外部から内部の詳細を隠蔽すること」

のことです。

イメージとしては、「薬のカプセル」です。

カプセル薬を飲む人は、中にどんな成分がどれだけ入っているかを知る必要はありません。

「飲む」という操作だけで効果が得られます。プログラムの世界でも同じように、利用者はオブジェクトの中身を知らなくても、決められた手続き(メソッド)を通じて機能を使える。これがカプセル化の考え方です。

📊 カプセル化の基本情報

項目 内容
英語名 Encapsulation
別名 情報隠蔽(Information Hiding)
分類 オブジェクト指向の三大要素の一つ(カプセル化・継承・多態性)
最大の効果 内部変更が外部に影響しにくくなる(保守性の向上)

解説

オブジェクト指向プログラミング(OOP)では、データ(属性)とそのデータに対する操作(メソッド)をクラスという単位にまとめます。

カプセル化は、このクラスの内部構造を外部から直接触れないように制限する仕組みです。

 

なぜ内部を隠す必要があるのか

内部データに外部から自由にアクセスできると、想定外の値が書き込まれたり、変更の影響が別のオブジェクトに波及したりします。

これはプログラムの不具合に直結します。内部を隠蔽し、あらかじめ用意したメソッド経由でのみ操作を許可すれば、不正な値の混入を防げます。

 

さらに、内部の実装を後から変更しても、メソッドのインターフェースが同じであれば利用側のコードを書き換える必要がありません。

 

アクセス修飾子による実現

多くのオブジェクト指向言語では、アクセス修飾子(private、protected、publicなど)を使ってカプセル化を実現します。

🔒 アクセス修飾子の役割(Javaの場合)

修飾子 アクセス範囲 用途
private 同一クラス内のみ 内部データを完全に隠蔽する
protected 同一クラス+サブクラス 継承先には公開したい場合に使う
public すべてのクラスからアクセス可 外部に公開するメソッド(窓口)に使う

属性をprivateにして直接アクセスを禁止し、publicなメソッド(getter/setter)を通じてのみ値の取得・変更を許可する設計が典型的なパターンです。

public class BankAccount {
    // 属性をprivateで隠蔽
    private int balance;

    // コンストラクタ
    public BankAccount(int initialBalance) {
        this.balance = initialBalance;
    }

    // 残高取得(getter)
    public int getBalance() {
        return this.balance;
    }

    // 入金(メソッド経由でのみ操作を許可)
    public void deposit(int amount) {
        if (amount > 0) {
            this.balance += amount;
        }
    }

    // 出金(不正な値を防止)
    public void withdraw(int amount) {
        if (amount > 0 && amount <= this.balance) {
            this.balance -= amount;
        }
    }
}

オブジェクト指向の他の要素との違い

カプセル化は「データと操作のまとめ+隠蔽」です。

 

これに対し、継承(インヘリタンス)は「親クラスの属性やメソッドを子クラスが引き継ぐ仕組み」、多態性(ポリモーフィズム)は「同じメッセージを送っても受け手によって動作が変わる性質」です。

📊 オブジェクト指向の三大要素 比較

要素 一言で言うと キーワード
カプセル化 データと操作をまとめ、内部を隠す 情報隠蔽、private、ブラックボックス
継承 親クラスの性質を子クラスに引き継ぐ インヘリタンス、基底クラス、派生クラス
多態性 同じメッセージで受け手ごとに動作が変わる ポリモーフィズム、オーバーライド

では、この用語が試験でどのように出題されるか見ていきましょう。

💡 カプセル化の核心を3行で

・データと操作を一体化し、外部から内部の詳細を隠蔽する
・保守性が向上し、内部変更が他のオブジェクトに波及しにくくなる
・継承は「引き継ぎ」、多態性は「動作の切り替え」、カプセル化は「隠蔽」と整理する


試験ではこう出る!

カプセル化は、オブジェクト指向の基本概念を問う定番テーマとして、FE・APで繰り返し出題されています。

📊 過去問での出題実績

試験回 出題内容 問われたポイント
FE H28秋
午前 問47
カプセル化を説明したものを選ぶ問題。4つの選択肢に抽象化・継承・汎化の説明が紛れ込む形式。 ・「データと手続を一つにして隠蔽する」が正解
・汎化・抽象化との混同がひっかけ
FE H26春
午前 問47
内部構造を変更しても利用者が影響を受けない概念を選ぶ問題。 ・「効果」を問う出題パターン
・クラス化・構造化・モジュール化がひっかけ
FE H21秋
午前 問46
カプセル化の効果として正しいものを選ぶ問題。 ・継承の効果、多態性の効果がひっかけ選択肢
・「内部変更が他のオブジェクトに影響しにくい」が正解

📝 IPA試験での出題パターン

パターン1:「カプセル化の説明を選べ」
4つのオブジェクト指向概念の説明文が並び、カプセル化に該当するものを選ぶ形式。ひっかけとして「抽象化」「汎化」「継承」の説明が混在する。キーワードは「データと手続を一つにまとめ」「内部を隠蔽」。

 

パターン2:「カプセル化の効果を選べ」
カプセル化がもたらすメリットを問う形式。「内部の変更がほかのオブジェクトに影響しにくい」が正解。継承の効果(親クラスの属性を子が利用)や多態性の効果(受け手によって動作が異なる)がひっかけ選択肢になる。

 

試験ではここまででOKです。アクセス修飾子の具体的な文法や、getter/setterの実装方法まで問われることはないので、深追いは不要です。


【確認テスト】理解度チェック

ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。


Q. オブジェクト指向におけるカプセル化の説明として、最も適切なものはどれでしょうか?

  • A. データとそれを操作する手続きを一つにまとめ、オブジェクトの内部の詳細を外部から隠蔽すること。
  • B. 基底クラスの属性やメソッドを派生クラスに受け継がせ、差分だけをプログラミングすること。
  • C. 同一のメッセージを送っても、受け手のオブジェクトによって異なる動作が実行されること。

正解と解説を見る

正解:A

解説:
カプセル化は、データとメソッドを一体化し、外部からの直接アクセスを制限してオブジェクト内部をブラックボックス化する概念です。これにより内部の仕様変更が利用側に波及しにくくなります。

選択肢Bは継承(インヘリタンス)の説明です。親クラスの性質を子クラスが引き継ぐ仕組みであり、コードの再利用を促進します。選択肢Cは多態性(ポリモーフィズム)の説明です。メッセージの受け手に応じて実行される処理が切り替わる性質を指します。


よくある質問(FAQ)

Q. カプセル化と情報隠蔽は同じ意味ですか?

厳密には異なります。カプセル化は「データと操作をまとめる」行為そのものを指し、情報隠蔽は「内部の詳細を外部から見えなくする」という目的を指します。ただし、IPA試験の範囲ではこの2つは同義として扱われており、区別を問われた出題実績はありません。試験対策としては同じ意味と覚えて問題ありません。

Q. カプセル化しないとどんな問題が起きますか?

外部から内部データを自由に書き換えられるため、想定外の値が設定されるリスクがあります。たとえば「残高」を直接マイナスにされたり、「年齢」に300が代入されたりする状況です。また、内部のデータ構造を変更するたびに、そのデータを参照しているすべてのコードを修正する必要が生じ、保守コストが膨れ上がります。

Q. カプセル化は手続き型言語でも使えますか?

概念としては近いことが可能です。C言語ではヘッダファイルに関数のプロトタイプ宣言だけを公開し、実装を別のソースファイルに隠す手法があります。ただし、言語仕様としてのアクセス修飾子(private等)を持たないため、オブジェクト指向言語ほど厳密な制御はできません。IPA試験では「カプセル化=オブジェクト指向の概念」として問われます。