情報処理試験を勉強していると、「コンポジションって継承と何が違うの?集約とはどう区別するの?」と混乱しがちです。この記事では、コンポジションの意味を日常の例え話で噛み砕いたうえで、試験での出題パターンまで一気に整理します。

対象試験と出題頻度

コンポジションは、基本情報技術者・応用情報技術者で出題されるオブジェクト指向の設計手法です。

「委譲」「継承」「多相性(ポリモーフィズム)」との区別を問う選択肢の一つとして登場するほか、UMLクラス図の集約関係として出題される場合もあります。

詳細をクリックして確認
対象試験:
基本情報技術者
応用情報技術者
出題頻度:
★★☆☆☆
ランクC(応用)余裕があれば覚える

用語の定義

コンポジション(Composition)とは、一言で言うと

 「複数のオブジェクトを部品として組み合わせ、新しいオブジェクトを構成する設計手法

のことです。日本語では「合成」とも呼ばれます。

イメージとしては、パソコンの組み立てです。

パソコンはCPU・メモリ・SSDなどの部品を組み合わせて1台の完成品になります。パソコン本体が壊れて廃棄されれば、中の部品も一緒に破棄される。

この「全体が消えると部分も消える」強い所有関係がコンポジションの特徴です。

📊 コンポジションの基本情報

項目 内容
英語名 Composition(合成)
分類 オブジェクト指向の設計手法(has-a関係の一種)
UMLでの表記 黒塗りひし形(◆)を全体側に付けた関連線
関連用語 集約(アグリゲーション)、継承(インヘリタンス)、委譲(デリゲーション)

解説

オブジェクト指向でクラスに機能を持たせる方法は、大きく「継承」と「合成(コンポジション)」の2つがあります。

継承は「親クラスの性質をそのまま引き継ぐ」アプローチですが、階層が深くなると修正の影響範囲が読みにくくなります。そこで、「必要な機能を持つオブジェクトを部品として内部に保持し、その部品に処理を任せる」というのがコンポジションの発想です。

コンポジションと集約の違い

どちらも「全体と部分(part-of)」の関係を表しますが、所有の強さが異なります。

観点 コンポジション(合成) 集約(アグリゲーション)
所有の強さ 強い。全体が消えると部分も消える 弱い。全体が消えても部分は残る
UMLの記号 黒塗りひし形(◆) 白抜きひし形(◇)
日常の例え 家と部屋(家を壊せば部屋もなくなる) 駐車場と車(駐車場を壊しても車は残る)
全体側の多重度 必ず1(部分は1つの全体にのみ属する) 0以上(部分が複数の全体に属せる)

図解:UMLクラス図での表記

UMLクラス図では、全体側のクラスにひし形を付けて関連線を引きます。黒塗り(◆)ならコンポジション、白抜き(◇)なら集約です。

UMLクラス図:コンポジション vs 集約

注文

————

注文明細

▲ コンポジション(黒塗り◆):注文が削除されれば注文明細も消える

チーム

————

メンバー

▲ 集約(白抜き◇):チームが解散してもメンバーは別のチームで活動できる

継承との使い分け

継承は「is-a関係(〜は〜の一種である)」に使います。例えば「犬は動物の一種」なら継承が適切です。一方、コンポジションは「has-a関係(〜は〜を持っている)」に使います。「車はエンジンを持っている」ならコンポジションが自然です。

観点 継承(is-a) コンポジション(has-a)
関係の意味 「〜は〜の一種」 「〜は〜を持っている」
犬 is-a 動物 車 has-a エンジン
結合度 高い(親クラスの変更が子に波及) 低い(部品の差し替えが容易)

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

💡 コンポジションの核心を3行で

・オブジェクトを部品として内部に保持し、新たなオブジェクトを構成する手法
・集約との違いは「全体が消えると部分も消える」かどうか(UMLでは◆ vs ◇)
・継承(is-a)ではなく has-a 関係で機能を組み立てる設計アプローチ


試験ではこう出る!

コンポジションは、FE・APの午前問題で「オブジェクト指向の用語の意味を区別させる問題」の選択肢として出題されています。コンポジション単独で正解になるケースは少なく、委譲や継承の出題でひっかけ選択肢に使われるパターンが中心です。

📊 過去問での出題実績

試験回 出題内容 コンポジションの扱い
FE R7年度
科目A 問12
オブジェクト指向で、異なるクラスのオブジェクトを同一インタフェースで操作した際に異なる動作をする特徴名を選ぶ問題。 不正解の選択肢として登場。正解は「多相性」
FE H30秋
午前 問49
「委譲」の説明として適切なものを選ぶ問題。選択肢エに「複数のオブジェクトを部分として用いて新たなオブジェクトを生成する仕組み」。 ひっかけ選択肢として登場。正解は「委譲(イ)」
AP H23特別
午前 問45
UMLクラス図で「顧客が複数の商品をまとめて注文する」関係を表す図を選ぶ問題。注文と注文明細の間にコンポジション関係。 クラス図の集約記号(黒塗りひし形)として正解の構成要素に含まれる
AP H25春
午前 問45
上記AP H23特別 問45の流用問題。 同上

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

パターン1:「用語の説明を選べ」で不正解選択肢として登場
FE H30秋 問49のように、委譲や多相性の正解を問う問題で「複数のオブジェクトを部分として用いて新たなオブジェクトを生成する」という記述がコンポジションのひっかけとして配置される。「部品として組み合わせる」というキーワードを見たら合成(コンポジション)と判断する。

 

パターン2:UMLクラス図の関連記号として登場
AP H23特別 問45のように、クラス図の多重度と集約の表記を読み取る問題で登場する。黒塗りひし形(◆)が全体側に付く点を押さえておけば解ける。

 

試験ではここまででOKです。「Composition over Inheritance(継承よりコンポジションを優先)」のような設計原則まで午前で問われることはないので、深追いは不要です。


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

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


Q. オブジェクト指向における「コンポジション(合成)」の説明として、最も適切なものはどれでしょうか?

  • A. あるオブジェクトに対する操作を、その内部で別のオブジェクトに依頼して処理させる仕組み。
  • B. 下位のクラスが上位のクラスの属性や操作を引き継ぎ、差分だけを定義する仕組み。
  • C. 複数のオブジェクトを部品として用いて、新たな一つのオブジェクトを生成する仕組み。

正解と解説を見る

正解:C

解説:
コンポジション(合成)は、複数のオブジェクトを部品として内部に保持し、それらを組み合わせて新しいオブジェクトを構成する手法です。FE H30秋 午前問49の選択肢エと同じ定義文です。

選択肢Aは委譲(デリゲーション)の説明です。処理を自分で行わず別のオブジェクトに任せる仕組みであり、部品を組み合わせてオブジェクトを構成するコンポジションとは異なります。選択肢Bは継承(インヘリタンス)の説明です。親クラスの性質を引き継いでサブクラスを作る仕組みであり、部品を組み合わせる手法ではありません。


よくある質問(FAQ)

Q. 「コンポジション」と「委譲(デリゲーション)」はどう違いますか?

コンポジションは「オブジェクトの構造」に関する概念で、部品を内部に保持して全体を構成する関係を指します。委譲は「処理の流れ」に関する概念で、あるオブジェクトが受けたメッセージの処理を別のオブジェクトに任せる仕組みです。実装上、コンポジションで部品として持ったオブジェクトに処理を委譲する場面は多いため、両者はセットで使われることが多いですが、概念としては別物です。

Q. 実務で「継承よりコンポジションを優先」と言われるのはなぜですか?

GoF(Gang of Four)のデザインパターン本で提唱された設計原則「Composition over Inheritance」に由来します。継承はクラス階層が深くなると、親クラスの変更が子・孫クラスに連鎖的に影響を及ぼし、保守が困難になります。コンポジションなら部品を差し替えるだけで動作を変えられるため、変更に強い設計になります。ただし、IPA試験の午前でこの原則が直接問われることはないため、実務知識として頭に入れておく程度で十分です。

Q. UMLクラス図で集約の記号が「白抜き(◇)」なのか「黒塗り(◆)」なのか見分ける方法はありますか?

「全体を消したとき部分も消えるか?」で判断します。消えるなら黒塗り(◆)=コンポジション、消えないなら白抜き(◇)=集約です。AP H23特別 問45では、「注文」が消えれば「注文明細」も消えるため、注文クラス側に黒塗りひし形が付く選択肢が正解でした。試験では色の濃淡が分かりにくい場合もあるため、問題文の文脈から全体と部分のライフサイクルを読み取る力が重要です。

Q. 「伝搬(プロパゲーション)」とコンポジションは何が違いますか?

伝搬は、あるオブジェクトに対して適用した操作が、関連するオブジェクトにも自動的に波及する仕組みです。FE H30秋 問49の選択肢アがまさにこの説明でした。コンポジションが「構造の構成方法」を指すのに対し、伝搬は「操作の連鎖」を指す点で根本的に異なります。試験では委譲・継承・コンポジション・伝搬の4つがセットで出題されるため、それぞれの違いを一言で言えるようにしておくと安心です。