合成と集約の違いとは?新人エンジニア向けにやさしく解説!
こんにちは。ゆうせいです。
今回はオブジェクト指向設計においてよく出てくる2つの関係、
「合成(Composition)」と「集約(Aggregation)」について、初心者の方でもわかるように丁寧に解説していきます!
「どっちも『〜を持つ』って関係なんじゃないの?」と思う方、
その感覚は正しいですが、実は設計のニュアンスに違いがあるんです。
まずはざっくり違いを表で確認!
項目 | 合成(Composition) | 集約(Aggregation) |
---|---|---|
関係性 | 全体と部分(強い所有関係) | 全体と部分(弱い所有関係) |
ライフサイクル | 全体が消えると部分も消える | 全体が消えても部分は残る |
例え | 人と心臓(心臓は人がいなければ存在しない) | 学校と生徒(生徒は他の学校に移れる) |
合成(Composition)とは?
「あるオブジェクトが完全に他のオブジェクトを所有している」関係
部分(部品)は、全体の一部としてのみ存在します。
つまり、全体が消えると部分も一緒に消えます。
Javaの例:
class Engine {
void start() {
System.out.println("エンジン始動!");
}
}
class Car {
private Engine engine = new Engine(); // CarがEngineを完全に所有
void drive() {
engine.start();
}
}
この場合、Engine
はCar
に組み込まれているだけで、Carが消えれば使われることはなくなります。
集約(Aggregation)とは?
「オブジェクトが他のオブジェクトを含んではいるが、独立して存在できる」関係
全体(親)が消えても、部分(子)は他でも再利用できるし、生き続けることができます。
Javaの例:
class Student {
String name;
Student(String name) {
this.name = name;
}
}
class School {
private List<Student> students;
School(List<Student> students) {
this.students = students; // 学校は生徒を「持っている」だけ
}
}
この場合、生徒(Student
)は学校に属していますが、別の学校に移動したり、個人として存在できます。
どちらも「has-a」関係。でも深さが違う!
- 合成(Composition)
→ 「完全に一部であり、密接に結びついている」
→ 強い結びつき - 集約(Aggregation)
→ 「含まれているが、独立しても成り立つ」
→ ゆるやかな結びつき
図解でイメージ!
合成:
[Car]
└── [Engine](Carが消えたら一緒に消える)
集約:
[School]
├── [Student A]
└── [Student B]
(Schoolがなくなっても生徒は存在できる)
新人エンジニアへのアドバイス
- 強い所有関係が必要なとき(使い回さない部品) → 合成(Composition)を使おう!
- オブジェクトが他でも使われる可能性があるとき → 集約(Aggregation)が向いているよ!
ただし、Javaのコード上では両者の違いは明示されないため、
設計書やUMLで意識的に区別することが大事です。
学習の指針
- 自分で合成と集約のクラス設計を練習してみよう
- 実際のフレームワークやライブラリで、どちらが使われているか調べてみよう
- UMLクラス図で
◆
(合成)と◇
(集約)の使い分けにも慣れていこう
設計意図を伝える力は、チーム開発でとても重要です!
次は「委譲との違い」や「合成と継承の使い分け」に進むと理解が深まりますよ!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール

- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。