オブジェクト間の関係(集約、合成)

オブジェクト指向プログラミング(OOP)におけるクラス設計では、オブジェクト間の関係性をどのように構築するかが重要な設計要素となります。その中でも代表的な関係として「集約(Aggregation)」と「合成(Composition)」があります。これらはいずれも「has-a(〜を持っている)」関係を表すものですが、そのライフサイクルの結びつきの強さによって異なります。


集約(Aggregation)

定義

集約は「部分が全体に属しているが、全体が破棄されても部分は残る」という関係です。部分オブジェクト(部品)は他のオブジェクトにも属する可能性があり、ライフサイクルは独立しています。

  • 大学(University)と学生(Student)の関係
    → 学生は大学に属しますが、大学が閉校しても学生という存在自体はなくなりません。他の大学に移ることもできます。

実装例(Java風)

java
class Student { String name; } class University { List<Student> students; // 学生のリストを保持(参照) }

この例では、UniversityStudent を「持っている」ものの、Student は別の文脈でも使えるため、集約関係となります。


合成(Composition)

定義

合成は「部分が全体に完全に属しており、全体が破棄されると部分も破棄される」という関係です。部分オブジェクトは全体オブジェクトに所有されており、ライフサイクルは全体に依存します。

  • 家(House)と部屋(Room)の関係
    → 部屋は家の一部であり、家がなくなれば部屋も存在できません。

実装例(Java風)

java
class Room { int number; } class House { private List<Room> rooms = new ArrayList<>(); // HouseがRoomを生成・所有 }

この場合、HouseRoom を内部的に生成し、他のクラスから独立して使用されることはありません。したがって合成関係です。


集約と合成の違いまとめ

比較項目 集約(Aggregation) 合成(Composition)
所有関係 弱い(参照) 強い(所有)
ライフサイクル 独立 親に依存
使い回し 原則不可
実装面 外部から渡す 内部で生成・管理

なぜ使い分けるのか?

設計においてこれらを明確に区別することにより、

  • 責務の明確化

  • オブジェクトの管理(生成・破棄)の一貫性

  • 保守性・拡張性の向上

が得られます。特に合成は、「部品を完全に管理したい」場合に使われ、集約は「他と共有できる部品を参照したい」場合に用いられます。

生成日:2025/06/01