システムアーキテクト 2012年 午前2 問21
問題文
社員と年の対応関係をUMLのクラス図で記述する。二つのクラス間の関連が次の条件を満たす場合、a, bに入る多重度の適切な組合せはどれか。ここで、年クラスのインスタンスは毎年存在する。
〔条件〕
(1)全ての社員は入社年を特定できる。
(2)年によっては社員が入社しないこともある。


選択肢
ア:
イ:(正解)
ウ:
エ:
🔒 解説は解答すると表示されます
UML関連の多重度【午前2解説】
正解の理由
設問の図では、各多重度はその近くにあるクラスの「個数」を示します。ここで、左側の多重度 a は「ある年(Year)に対して紐づく社員(Employee)の数」を表し、右側の多重度 b は「ある社員が紐づく年(入社年)の数」を表します。
条件(1)「全ての社員は入社年を特定できる」は、各社員が必ず1つの年インスタンスを持つことを意味するので、社員側から見た年の多重度は必ず 1..1 になります(したがって イ の b=1..1 が必要です)。
条件(2)「年によっては社員が入社しないこともある」は、ある年に社員が0人である可能性を認めるので、年から見た社員の多重度は 0..* になります(したがって イ の a=0..* が適合します)。以上より選択肢は イ(a=0..*、b=1..1)が正しい組合せです。
条件(1)「全ての社員は入社年を特定できる」は、各社員が必ず1つの年インスタンスを持つことを意味するので、社員側から見た年の多重度は必ず 1..1 になります(したがって イ の b=1..1 が必要です)。
条件(2)「年によっては社員が入社しないこともある」は、ある年に社員が0人である可能性を認めるので、年から見た社員の多重度は 0..* になります(したがって イ の a=0..* が適合します)。以上より選択肢は イ(a=0..*、b=1..1)が正しい組合せです。
解法ステップ
- 多重度の位置の意味を確認する。多重度は「その近くにあるクラスが、相手クラスの1インスタンスに対して何個あり得るか」を示す。
- 条件(1)を数値化する:全ての社員が入社年を持つ → 「社員1人につき年が必ず1つ」 → 年の多重度(社員から見た年)は 1..1。→ b = 1..1。
- 条件(2)を数値化する:年によっては社員が入らない → 「ある年に社員が0人でもよい」 → 年から見た社員は 0..。→ a = 0..。
- 選択肢と照合して、a=0..*、b=1..1 の組合せを選ぶ(選択肢 イ)。
選択肢別の誤答解説
-
ア(a=0..*、b=0..1)
b=0..1 は「社員が入社年を持たない場合があり得る」ことを許すため、条件(1)「全ての社員は入社年を特定できる」に反します。よって不適。 -
イ(a=0..、b=1..1)
a=0.. は「年によっては社員が入社しない(0人でよい)」を満たし、b=1..1 は「全社員が必ず1つの入社年を持つ」を満たす。条件両方に整合するため正解。 -
ウ(a=1..、b=0..1)
a=1.. は「各年に必ず1人以上の社員が存在する」を意味し、条件(2)と矛盾します。また b=0..1 は社員が入社年を持たない可能性を認めるため条件(1)にも反します。よって誤り。 -
エ(a=1..、b=1..1)
b=1..1 は条件(1)に合致しますが、a=1.. は「年ごとに必ず1人以上の社員が入社する」ことを要求し、条件(2)「年によっては社員が入社しないこともある」と矛盾します。よって誤り。
よくある誤解
-
「多重度の位置と意味を取り違える」
多重度はそのラベルの近くにあるクラスの個数を示す(相手クラス1つあたり何個あるか)。ここでは a が「1年あたりの社員数」、b が「1社員あたりの年数」を表す点を混同しやすいので注意すること。 -
「1..* を “ちょうど1” と誤解する」
1..* は「最低1つ以上」を意味し、ちょうど1つではない。条件(2)との整合性を検討するときに誤判定しやすい。 -
「条件(1)は年側の多重度を変える」と勘違いする
条件(1)は「全社員が入社年を持つ」ことを示すため、社員が参照する年側(b)に 1..1 の制約を課す。年側(a)の下限を1にする根拠にはならない。
補足コラム
UMLのクラス図で「入社年」のような概念は、単純な値(例:整数の西暦)でよければクラスの属性として表すこともできます(例:Employee.ageOfEntry: Integer)。しかし「年」を独立したクラスにした場合は、年ごとに集計や属性(例:年度ごとの予算や人数)を保持したいときに有用です。設計意図に応じて、属性にするか関連(Association)にするかを選びます。
FAQ
Q1: b を 1..* にするとどうなるか?
A1: b=1..* は「ある社員が複数の入社年を持つ可能性がある」ことを意味します。入社年は通常1つしかないため設問の条件(1)に反します。
A1: b=1..* は「ある社員が複数の入社年を持つ可能性がある」ことを意味します。入社年は通常1つしかないため設問の条件(1)に反します。
Q2: 年インスタンスが毎年存在すると書かれているが、それは a の下限を1にする根拠になるか?
A2: いいえ。年インスタンスが存在することと、その年に社員が必ず入社することは別です。年が存在しても社員が0人である可能性が条件(2)により許されているため、a の下限は 0 でよい(0..*)。
A2: いいえ。年インスタンスが存在することと、その年に社員が必ず入社することは別です。年が存在しても社員が0人である可能性が条件(2)により許されているため、a の下限は 0 でよい(0..*)。
Q3: 多重度の表記で「1」と「1..1」は同じか?
A3: 実務上はほぼ同じ意味で、どちらも「必ず1つ」を表します。ただし試験では明確に 1..1 と書かれている選択肢が出ることがあるので表記に注意してください。
A3: 実務上はほぼ同じ意味で、どちらも「必ず1つ」を表します。ただし試験では明確に 1..1 と書かれている選択肢が出ることがあるので表記に注意してください。
関連キーワード: UML、多重度、クラス図、関連(Association)、入社年

\ せっかくなら /
システムアーキテクトを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

