【オブジェクト指向・システム設計】クラスとオブジェクトを結ぶ絆!「is-a関係とhas-a関係」|情報処理問題1000本ノック
基本情報技術者試験、応用情報技術者試験、システムアーキテクト試験の「オブジェクト指向・UMLモデリング」分野で頻出の重要テーマ。オブジェクト間の静的な関係を表す「リレーション(一般化と集約・複合)」の2大分類(is-a / has-a)を整理して攻略しましょう。
■ オブジェクト指向におけるオブジェクト間の関係(リレーション)
オブジェクト指向設計では、クラスやオブジェクト同士がどのように結びついているかを正しく定義することが、保守性の高いソフトウェアを作る上で極めて重要です。主なリレーションには大きく分けて2つの視点が存在します。
| 関係の種類 | 概念と特徴・UML表現 | 具体例 |
|---|---|---|
| 1. is-a関係 (Generalization / 継承) |
「Aは、Bである (A is a B)」という包含・継承(Generalization)関係。 スーパークラス(親)の特性をサブクラス(子)が引き継ぎ、特殊化(特化)を行います。 ・UMLでは「白抜きの三角矢印(実線)」で表現されます。 |
・「人間(Sub)は、動物(Super)である」 ・「社員(Sub)は、従業員(Super)である」 ・「車(Sub)は、乗り物(Super)である」 |
| 2. has-a関係 (Association / Aggregation / Composition) |
「Aは、Bを持っている / 構成される (A has a B)」という集約(Aggregation)および複合(Composition)関係。 全体と部分の結びつきを示します。 ・UMLでは「白抜き(集約)または黒塗り(複合)のひし形」で表現されます。 |
・「車(全体)には、ハンドル(部分)がある」 ・「パソコン(全体)には、CPUやメモリ(部分)がある」 |
試験対策の重要キーワード・深掘り
- 集約(Aggregation):全体と部分が「独立して存在できる」関係(例:「学校」と「生徒」)。学校がなくなっても生徒(人間)は消えません。白抜きのひし形で表します。
- 複合集約 / コンポジション(Composition):全体と部分の結びつきが非常に強く、全体が消滅すると部分も同時に消滅する関係(例:「家」と「部屋」や「人間」と「心臓」)。黒塗りのひし形で表します。
- 継承(is-a)と委譲(has-a)の選択:オブジェクト指向設計の原則として、何でもかんでも「is-a(継承)」で繋ぐとコードが硬直化(緊密結合)するため、「has-a(集約や委譲)」を活用して部品化する方が柔軟性が高くなるとされています。
※例えるなら、生物の血筋や分類を表す家系図のような縦の繋がりが「is-a(~の一種である)」で、機械や製品のようにパーツを組み立てて成り立っている構造が「has-a(パーツを持っている)」です。この2つを混同せずに使い分けることがオブジェクト設計の基本となります。
PR