合成と集約の違いとは?新人エンジニア向けにやさしく解説!

こんにちは。ゆうせいです。

今回はオブジェクト指向設計においてよく出てくる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();
    }
}

この場合、EngineCar組み込まれているだけで、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年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。