0コメント

【応用情報技術者】午後試験頻出の「オブジェクト指向・UML」得点源にするための全知識

【応用情報技術者】オブジェクト指向設計を完全攻略!UML・カプセル化・継承の要点を徹底解説

🚀【保存版】オブジェクト指向設計用語・UML図法全20種以上を総まとめ|AP試験対応

システム開発における「データ中心アプローチ(DOA)」を一歩進めたのがオブジェクト指向です。本記事では、実世界の「物」をコンピュータ上に再現するための設計手法を、網羅的に解説します。

🎯 この記事の到達目標
  • オブジェクト指向の基本概念(カプセル化・クラス・継承等)を理解する
  • クラス間の関係(is-a, part-of)とポリモーフィズムを区別できる
  • UML各図(クラス図、シーケンス図等)の読み方をマスターする


🔍 午後試験攻略への入り口:オブジェクト指向の核心

応用情報技術者試験の午後問題において、オブジェクト指向設計は「システムアーキテクチャ」や「ソフトウェア設計」の設問で中心的な役割を果たします。単なる用語の暗記ではなく、「現実のビジネスルールをいかにクラス図やシーケンス図へ落とし込むか」という実践的な理解が問われます。

🔑 登場する最重要キーワード
  • カプセル化・継承・ポリモーフィズム(三大要素)
  • クラスとインスタンス(定義と実体)
  • 汎化(is-a)と集約(part-of)(関係性)
  • 抽象クラスとオーバーライド(再定義の仕組み)
📝 午後試験の出題傾向
  • 図間の整合性チェック: クラス図のメソッド名とシーケンス図のメッセージ名の一致を確認させる問題が頻出。
  • 多重度の判定: 業務ルールを読み取り、クラス間の「1:多」などの多重度を穴埋めさせる。
  • 設計変更への対応: 新機能追加に伴うサブクラスの導入や、委譲による再利用性の向上などが問われる。

※本記事では、これらの概念を「実務での利用シーン」を交えて深掘り解説します。



1. オブジェクト指向の基本概念 基本

📦 オブジェクトとカプセル化

オブジェクトとは、単なるデータではなく、データ(属性)とそのデータに対する手続(メソッド)を1つにまとめたものです。

  • カプセル化: データと手続を一体化し、内部の実装詳細を隠す(情報隠ぺい)こと。
  • メリット: 内部構造を変えても他のオブジェクトに影響を与えないため、独立性が高く、再利用が容易になります。
  • メッセージ: オブジェクト同士はメッセージを送り合うことで、メソッドを駆動し相互に作用します。

※メソッドはインターフェースの役割を果たし、メッセージに応じた処理を記述します。

🏗️ クラスとインスタンス

クラスは「金型(雛形)」であり、インスタンスはそこから作られた「製品(実体)」です。

  • クラス: 類似オブジェクトの共通性質を抽象化して定義したもの(定義情報)。
  • インスタンス: クラスの使用宣言によりメモリ上に生成された実体。具体的な値を持ちます。
  • クラスライブラリ: 便利なクラスをひとまとめにした集まり。
---

2. 継承とクラス間の関係 重要

🧬 インヘリタンス(継承)

上位の基底クラス(スーパークラス)の性質を、下位の派生クラス(サブクラス)が引き継ぐことです。差分のみを定義する手法を差分プログラミングと呼びます。

🔗 クラス間の2大関係

関係名 別名 キーワード 具体例
is-a関係 汎化ー特化 ~は…である 人間は動物である(人間 is-a 動物)
part-of関係 集約ー分解 ~は…の一部である タイヤは車の一部である(タイヤ part-of 車)
---

3. 高度な応用概念:ポリモーフィズム 応用

🎭 ポリモーフィズム(多態性)とオーバーライド

同じメッセージを送っても、オブジェクトごとに異なる動作をする特性です。これを実現するために、スーパークラスのメソッドをサブクラスで書き直すことをオーバーライドといいます。

👻 抽象メソッドと抽象クラス

名前だけ定義して中身を作らないメソッドを抽象メソッド、それを持つクラスを抽象クラスと呼びます。これらは直接インスタンス化できず、必ず継承して具象クラスで実装する必要があります。

🛠️ その他の重要用語

  • オーバーロード: 同じ名前のメソッドを、引数の型や数だけ変えて複数定義すること。
  • 委譲(Delegation): ある処理を自分で行わず、他のオブジェクトに代行させること。
  • 伝搬(Propagation): 1つの操作が、関連するオブジェクトへ自動的に波及すること。
---

4. UML 2.0 によるモデリング 試験頻出

オブジェクト指向の分析・設計にはUML(Unified Modeling Language)が必須です。

📊 クラス図:静的な構造

クラス間の「関連」「汎化」「集約」を表現します。

  • 多重度: 「0..*」(0以上)、「n..m」(nからmまで)などで関係数を明示。
  • 可視性: + (Public), - (Private), # (Protected)。
  • コンポジション(◆): 集約より強く、全体と部品が運命共同体(全体が消えれば部品も消える)の関係。

シーケンス図:動的な振る舞い

オブジェクト間のやり取りを時間軸で表現します。ライフライン(生存期間)とアクティベーション(実行区間)が重要です。

📝 その他の図法

  • ユースケース図: 利用者(アクタ)から見た機能の定義。
  • ステートマシン図: オブジェクトの状態遷移。
  • アクティビティ図: 処理の流れ(フローチャートの進化版)。
---

5. 具体的な使用状況:実務ではどう使う?

オブジェクト指向は、以下のような開発シーンで威力を発揮します。

  • GUI開発(Windows/Web): 「ボタン」という抽象クラスから、「送信ボタン」「キャンセルボタン」を特化させて作成する。
  • ゲーム開発: 「敵キャラ」クラスを継承して、「スライム」や「ドラゴン」を作成。共通の攻撃メソッド(ポリモーフィズム)を呼び出すだけで個別の動きをさせる。
  • SoS (System of Systems): SysML(UMLの拡張版)を用いて、複数の複雑なシステムが組み合わさる大規模プロジェクトを設計する。
---

🏁 まとめ:要点チェックリスト

  • カプセル化はデータと手続をまとめ、独立性を高める。
  • クラスは設計図、インスタンスは実体。
  • is-aは継承関係、part-ofは構成(部品)関係。
  • ポリモーフィズムは「送り手は同じでも、受け手で動きが変わる」こと。
  • UMLクラス図の矢印や記号(◆、◇)の意味を正確に覚える。


あとがき:試験の「先」にあるオブジェクト指向の価値

お疲れ様でした。オブジェクト指向の学習は、多くのカタカナ用語や抽象的な概念が登場するため、最初は戸惑うかもしれません。しかし、応用情報技術者試験でこの分野が重視されるのには明確な理由があります。

🌱 周辺知識と背景:なぜ「オブジェクト指向」なのか?
かつてのシステム開発(手続型)では、プログラムの一部を修正すると予期せぬ場所でバグが発生する「スパゲッティコード」が問題でした。オブジェクト指向は、「変更に強く、部品のように再利用できるソフトウェア」を作るための人類の知恵の結晶です。現在主流のJava, Python, TypeScriptといった言語の根底には、すべてこの思想が流れています。

🎯 今後の学習アドバイスと出題傾向
近年の試験では、単なる知識を問う問題から、「デザインパターン」「アジャイル開発」との親和性を問う問題へとシフトしています。午後問題に取り組む際は、「なぜこのクラスを継承させたのか?」「なぜインターフェース(抽象クラス)を挟んだのか?」という設計者の意図を汲み取る練習を積みましょう。

ここでの学びは、試験合格のためだけの知識ではありません。現場に出たとき、大規模なコードベースを読み解き、保守性の高い設計を行うための「一生モノの武器」になります。あなたのエンジニアとしてのステップアップを心より応援しています!

— IT専門講師 / テクニカルライター


✍️ 午後試験突破!「記述解答」の定型フレーズ集

※下線部は採点ポイント(キーワード)です。そのまま暗記することで部分点を確実に奪取しましょう。

問われる用語 記述解答の定型文(模範回答)
カプセル化の利点 データと手続を一体化し、内部構造を隠ぺいすることで、他のオブジェクトからの影響を受けにくくし、独立性を高める。
インヘリタンス
(継承)の目的
上位クラスの定義を再利用し、差分のみを定義することで、開発効率の向上とコードの冗長性の排除を図る。
ポリモーフィズム
(多態性)の効果
メッセージの送り手側が、受け手の具体的なクラスを意識せずに操作でき、実行時に動的に動作を切り替えることが可能になる。
オーバーライド スーパークラスで定義されたメソッドを、サブクラス側で独自の処理として再定義すること。
コンポジション 「全体」と「部分」の生存期間が一致しており、全体が削除された際には関連する部分オブジェクトも同時に消滅する強い集約関係。
💡 試験直前アドバイス:
午後問題では「独立性が高まる」「再利用性が向上する」「変更時の影響を局所化できる」というフレーズが汎用的に使えます。理由を問われたら、まずこれらを軸に文章を組み立ててみましょう。


🗂️ オブジェクト指向 暗記必須用語20選(Flash Cards)

カードに触れると回答が表示されます

オブジェクト
データ(属性)と手続(メソッド)を一つにまとめたもの
カプセル化
データと手続を一体化し、内部を隠ぺいして独立性を高めること
クラス
オブジェクトを生成するための設計図(テンプレート)
インスタンス
クラスから生成された具体的な値を持つ実体
メソッド
オブジェクトが実行する具体的な処理(操作)のこと
メッセージ
オブジェクト間で作業依頼や相互作用を行うための通信
インヘリタンス
上位クラスの属性やメソッドを下位クラスが引き継ぐこと
スーパークラス
継承関係において、基となる上位クラス(基底クラス)
サブクラス
上位クラスを継承して作成された下位クラス(派生クラス)
差分プログラミング
継承を利用し、追加・変更点だけを記述する効率的な手法
is-a関係
汎化-特化関係。「人間は動物である」のような関係
part-of関係
集約-分解関係。「エンジンは車の一部」のような関係
ポリモーフィズム
同じメッセージでも、相手によって異なる動作を行う特性
オーバーライド
スーパークラスのメソッドをサブクラスで再定義すること
オーバーロード
同一名で引数の型や数が異なる複数のメソッドを定義すること
抽象クラス
インスタンス化できず、共通概念のみを定義するクラス
委譲(デリゲーション)
ある操作をその内部で他のオブジェクトに任せること
コンポジション
全体と部分の生存期間が同じ、非常に強い集約関係
多重継承
複数のクラスから継承すること(Javaでは禁止)
UML
オブジェクト指向設計で用いる標準的なモデリング言語

※繰り返し確認して、用語の反射速度を上げましょう!



⚠️ 試験に出る!「ひっかけ」対策一問一答チェック

クリックまたはタップで、間違いやすいポイント(正解)を表示します

「オーバーライド」と「オーバーロード」の違いは?
ライドは「上書き」、ロードは「多重定義」です。ライドは継承関係にある親子クラス間でメソッドを再定義すること。ロードは同一クラス内で引数が異なる同名メソッドを定義すること。
「カプセル化」をすると実行速度は速くなる?
いいえ、速くなりません。 カプセル化の目的は、保守性や独立性を高めることであり、実行速度(パフォーマンス)の向上ではありません。試験で「処理効率を上げるため」とあれば×です。
抽象クラスからインスタンス(実体)は生成できる?
生成できません。 抽象クラスはメソッドのシグネチャ(名前)だけを持つ未完成の設計図です。必ずサブクラスで具体化してから生成します。
「集約」と「コンポジション」の決定的な違いは?
部分が全体と運命を共にするかどうかです。コンポジション(黒塗り菱形 ◆)は全体が消えたら部分も消えますが、集約(白抜き菱形 ◇)は部分が独立して存続できます。
多重継承はすべてのオブジェクト指向言語で可能?
言語によります。 例えばC++では可能ですが、Javaでは複雑化を防ぐために禁止されています。共通的な性質のみを引き継ぐ「インターフェース」の仕組みが代わりに使われます。
UMLの「アクティビティ図」はフローチャートと同じ?
似ていますが、並行処理が書けます。 アクティビティ図は単なる順次処理だけでなく、処理の「フォーク(分岐)」や「ジョイン(同期)」を表現できるのがフローチャートとの大きな違いです。
💡 ひっかけ回避のコツ: 問題文に「常に」「必ず」「~の目的は……である」という極端な表現や、目的のすり替え(保守性⇔効率)があったら要注意です。


📑 オブジェクト指向設計:全用語網羅パーフェクト・リスト(完全版)

テキスト(p.514-519)に登場する全概念・注釈・記号を体系的に整理しました。応用情報の午後試験で問われる「図の読み取り」に必須の知識です。

1. オブジェクト指向の基本要素

● オブジェクト(Object)
データ(属性)とそれに対する手続(メソッド)を1つにまとめたもの。単なるデータそのものではない点に注意。
● カプセル化(Encapsulation)
データとメソッドを一体化し、内部の実装詳細を外部から見えないようにすること(情報隠ぺい)。
● 属性(Attribute)
オブジェクトが持つ固有の値。データ部分。
● メソッド(Method)
オブジェクトの操作(手続)。オブジェクトのインターフェースとしての役割を持つ。
● メッセージ(Message)
オブジェクト同士が作業依頼や情報のやり取りに使う信号。メソッドを駆動させるトリガー。

2. クラスの構造と継承

● クラス(Class)
共通する性質を抜き出し、一般化・抽象化して定義した「テンプレート(雛形)」。
● インスタンス(Instance)
クラスに基づき具体的に生成された「実体」。
● クラスライブラリ
便利なクラスを集めた集合体。
● インヘリタンス(Inheritance / 継承)
上位クラスの属性やメソッドを下位が引き継ぐこと。
● 基底クラス(スーパークラス)
階層の最上位にあるクラス、または派生元のクラス。
● 派生クラス(サブクラス)
継承して作成された下位クラス。
● 差分プログラミング
継承を利用し、変更・追加が必要な「差分」だけを定義する効率的な開発手法。
● 多重継承
複数のクラスを継承すること。C++は可能、Javaは禁止されている。

3. クラス間の論理的関係

● is-a関係(汎化-特化)
「下位クラス is a 上位クラス(~は…である)」が成立する関係。
● 汎化(Generalization)
下位の共通性質をまとめて上位クラスを定義すること。
● 特化(Specialization)
上位の性質を具体化して個別部分を加え、下位クラスを定義すること。
● part-of関係(集約-分解)
「部分は全体の一部である(~は…の一部である)」という構成関係。
● 集約クラス(全体) / 部分クラス(部品)
part-of関係における上位(まとめ役)と下位(構成要素)。

4. 動的な特性・高度な概念

● ポリモーフィズム(Polymorphism / 多態性)
同一のメッセージに対して、オブジェクトごとに異なる動作をすること。
● オーバーライド(Override)
スーパークラスのメソッドを、サブクラス側で独自の内容に書き直すこと。
● オーバーロード(Overload)
同一クラス内に、名前が同じで引数の型や数が異なるメソッドを複数定義すること。
● 抽象メソッド(Abstract Method)
名前だけ定義し、実装を持たないメソッド。サブクラスでのオーバーライドを前提とする。
● 抽象クラス / 具象クラス
抽象メソッドを持つインスタンス化できないクラス(抽象)と、それを実装した実体化可能なクラス(具象)。
● 委譲(Delegation)
自分への操作を、他のオブジェクトに代行(丸投げ)させること。
● 伝搬(Propagation)
あるオブジェクトへの操作が、関連する他オブジェクトへ自動的に波及すること。

5. UML 2.0 詳細記法・図法

● 多重度(Multiplicity)
「n」(のみ)、「n..m」(nからmまで)、「n..*」(n以上)、「n, m」(nかm)という数値表現。
● 可視性(アクセス権記号)
「+」(公開)、「-」(自クラスのみ)、「#」(自クラスと派生クラスのみ)。
● コンポジション(◆)
集約よりも強い結合。全体が削除されると部品も削除される(生存期間が同一)。
● 関連(―) / 依存(<---)
何らかの関係がある「関連」と、変更の影響を受ける「依存」。
● オブジェクト図
クラスではなく、ある時点でのインスタンス同士の関連を表す図。
● アクタ(Actor)
ユースケース図において、システム外部から機能を操作する利用者や外部システム。
● ライフライン / アクティベーション
シーケンス図における生存期間(点線)と、実際に動作している期間(長方形)。
● コミュニケーション図
時間軸ではなく「オブジェクト間の関連(データリンク)」を重視した図。
● パラメトリック図
SysMLで使用される、モデル要素間の制約条件を記述するための図。
● SoS (System of Systems)
複数の独立したシステムが組み合わさって実現される巨大なシステム。SysMLが適している。


次のステップ: 実際の過去問で、クラス図とシーケンス図の対応関係を解いてみましょう。この基礎知識があれば、複雑なシナリオ問題もスッキリ理解できるはずです!

この記事へのコメント