資格道場 › レッスン一覧 › システム開発技術
システム開発技術・5/12・12分

オブジェクト指向の基本(クラス・継承・多相性)

ゴール

説明文を読んで、クラス・インスタンス・継承・カプセル化・多相性・オーバライド・委譲などの用語を選べるようになる。「〜は〜の一種」かどうかで、汎化(継承)の関係と、部分と全体の関係を見分けられるようになる。

オブジェクト指向は過去問で繰り返し出題されている。どの問題も説明文に合う用語を選ぶ形で計算はないので、用語の違いを押さえれば得点しやすい。

このレッスンで稽古する(用語チェック・過去問)

結論:用語当てなので「説明文のキーワード→用語」を覚える

オブジェクト指向は、データと、そのデータを扱う手続をひとまとめにした部品(オブジェクト) を組み合わせてシステムを作る考え方。試験では「この説明は何という用語か」「この組合せは正しいか」という形で聞かれる。下の対応表を覚えれば、このレッスンの大半の問題は解ける。

説明文に出るキーワード 用語
データと手続を一つにまとめ、内部を外から隠す カプセル化
共通の性質を取り出して整理する 抽象化(クラス同士なら汎化)
上位クラスの属性や操作を下位クラスが引き継ぐ 継承
上位クラスのメソッドを下位クラスで再定義する オーバライド
同じクラスに、名前が同じで引数が違うメソッドを並べる オーバロード
同じ指示でも、相手のクラスによって動作が変わる 多相性(ポリモーフィズム)
受けた操作を内部で他のオブジェクトに依頼する 委譲
他のオブジェクトに動作を起こさせる メッセージ
クラスの定義から作られる実体 インスタンス

オブジェクト指向の基本概念は4つ

基本概念は 抽象化・カプセル化・継承・クラス の4つ。選択肢に 構造化・正規化・分割・仮想化 が混ざっていたら、それは別の分野の用語なので外す。構造化は構造化プログラミング、正規化はデータベースの用語である。

概念 ひとことで 見分け方
抽象化 細かい違いを捨てて、共通する性質だけを取り出す 「共通の性質を取り出す」「整理する」
カプセル化 データと手続を一つにまとめて、中身を外から隠す 「隠蔽」が出たらこれ
継承 上位クラスの性質を下位クラスが引き継ぐ 「受け継がせる」「利用できる」
クラス 同じ性質をもつオブジェクトをまとめた定義(ひな形) 「定義」「ひな形」

カプセル化は、前のレッスンの 情報隠蔽(モジュールの中身を外に見せない)と同じ発想である。外からは決められた手続を通してしかデータを触れないので、中を直しても外への影響が小さい。API の中の実装を隠し、決めたエンドポイントだけを公開するのと同じ考え方だ。

クラスとインスタンス:設計図と、建てた家

クラスは設計図、インスタンスはその設計図から建てた一軒一軒の家にあたる。1枚の設計図から何軒でも家が建つように、1つのクラスからインスタンスはいくつでも作れる。インスタンスはオブジェクトとも呼ぶ。

クラス インスタンス(オブジェクト)
正体 同じ種類のものに共通する性質の定義 定義に基づいて作られた実体
例 公園、国、公務員 代々木公園、日本、私の父
数 1つ 1クラスから複数作れる

見分け方:「AはB(という種類)の一つ」と言えて、Aが固有名詞のような具体的な1個なら、AとBはインスタンスとクラスの関係である。

  • 公園 と 代々木公園 → 代々木公園は公園の一つ → クラスとインスタンス
  • 中之島公園 と 代々木公園 → どちらも具体的な1個 → インスタンス同士
  • 公園 と ぶらんこ → ぶらんこは公園の部品 → 全体と部分
  • 俸給生活者 と 公務員 → 公務員は俸給生活者の一種で、どちらも種類 → クラス同士(汎化)
クラス:公園(設計図)作る代々木公園(実体)中之島公園(実体)…1つのクラスからインスタンスはいくつでも作れる
1つのクラス(設計図)から、インスタンス(実体)がいくつでも作られる。

汎化・特化(is-a)と、全体と部分(part-of)を見分ける

汎化は、複数のクラスの共通部分をまとめて上位クラスを作ること。逆に、上位クラスから特殊な下位クラスを作るのが特化である。汎化の関係は英語で is-a(〜は〜の一種)と呼び、継承はこの関係のクラス同士で起きる。

関係 確かめ方 例 継承か
汎化・特化(is-a) 「下は上の一種」と言える 自動車←トラック、図形←三角形、哺乳類←人・犬・猫 継承する
全体と部分(集約・part-of) 「下は上の部品」と言える 自動車←エンジン・タイヤ、人間←頭、会社←社員 継承しない
属性 「下は上の項目・値」と言える 自動車←製造番号、取引先←会社名・住所 継承しない

上位クラスはスーパクラスまたは基底クラス、下位クラスはサブクラスまたは派生クラスと呼ぶ。名前が違うだけで、指しているものは同じだ。

自動車一種(is-a)部品(part-of)トラック継承するエンジン・タイヤ継承しない「下は上の一種」と言えたら継承「下は上の部品」なら全体と部分
トラックは自動車の一種なので継承するが、エンジン・タイヤは自動車の部品なので継承しない。

継承とオーバライド:差分だけ書けばよい

継承を使うと、サブクラスには基底クラスにない追加分と、上書きする部分だけを書けばよい。ほかはすべて基底クラスから引き継ぐので、同じコードを何度も書かずに済む。サブクラスのインスタンスは、引き継いだ操作を自分で実行する(スーパクラスのインスタンスに頼むわけではない)。

そのかわり、基底クラスを変更するとサブクラスにも影響が出る。また、継承したデータが常にサブクラスから保護されるわけではない。

用語 何をするか どこで
オーバライド(override=上書き) スーパクラスのメソッドを、同じ名前のまま中身を再定義する サブクラス
オーバロード(overload=多重定義) 名前が同じで、引数の型・個数・並び順が違うメソッドを複数定義する 同じクラスの中

「再定義」「上書き」ならオーバライド、「引数が違う」ならオーバロードと覚える。

基底クラス属性・操作継承(引き継ぐ)サブクラス(書くのは差分だけ)引き継いだ部分 … 書かない追加分 … 新しく書く上書きする部分 … 再定義(オーバライド)
サブクラスは基底クラスを引き継ぎ、追加分と上書きする部分だけを書けばよい。

多相性(ポリモーフィズム):同じ指示でも動作が変わる

多相性とは、異なるクラスのオブジェクトに**同じ指示(同じインタフェース)**を出しても、それぞれのクラスに合った動作をする性質のこと。たとえば「鳴け」と指示すると、犬のオブジェクトは「ワン」、猫のオブジェクトは「ニャー」と鳴く。呼び出す側は、相手が犬か猫かを気にしなくてよい。

多相性は、サブクラスごとにオーバライドすることで実現する。基底クラス「動物」の「鳴く」を、犬と猫のクラスがそれぞれ再定義しておくのである。そのため「多相性を実現するために特有のものは?」と聞かれたら、答えはオーバライドになる。

呼び出す側「鳴け」「鳴け」犬鳴くを再定義猫鳴くを再定義ワンニャー呼び出す側は相手が犬か猫かを気にしない
同じ「鳴け」という指示でも、犬はワン、猫はニャーと、クラスごとに動作が変わる。

メッセージと委譲(出題は少ないので要点だけ)

メッセージは、他のオブジェクトに操作(メソッド)の実行を頼み、動作を起こさせるもの。オブジェクトが内部にもつデータ(属性)や、オブジェクトを作るひな形(クラス)とは違う。

委譲は、受けた操作を自分では処理せず、内部で他のオブジェクトに依頼する仕組み。上司が仕事を受けて部下に任せるイメージである。

用語 説明
委譲 受けた操作を、内部で他のオブジェクトに依頼する
継承 下位クラスが上位クラスの属性・操作を引き継ぐ
集約・コンポジション 複数のオブジェクトを部品として組み合わせ、一つのオブジェクトを作る
例題 1

基底クラスと派生クラスの組を「〜は〜の一種」で選ぶ

オブジェクト指向における基底クラスと派生クラスの関係にあるものはどれか。

ア “会社” と “社員”
イ “自動車” と “エンジン”
ウ “図形” と “三角形”
エ “人間” と “頭”

出典:基本情報技術者試験 科目A免除 修了試験 20251214 実施分 問35

解き方と答えを見る
  1. 基底クラスと派生クラスは、継承の関係(is-a=「派生は基底の一種」)だと確認する。
  2. 各選択肢の2つめを主語にして「〇〇は△△の一種」と読んでみる。
  3. ア「社員は会社の一種」→ おかしい。社員は会社に所属する人で、全体と部分(または関連)の関係。
  4. イ「エンジンは自動車の一種」→ おかしい。エンジンは自動車の部品(part-of)。
  5. ウ「三角形は図形の一種」→ 正しい。is-a が成り立つ。
  6. エ「頭は人間の一種」→ おかしい。頭は人間の体の一部(part-of)。
  7. is-a が成り立つのはウだけなので、ウが基底クラスと派生クラスの関係である。

答え:ウ(“図形” と “三角形”)。「〜の一種」と言えれば継承、「〜の部品」なら集約と判定する。

要点(試験直前に読む)

  • 基本概念の4つ=抽象化・カプセル化・継承・クラス。構造化・正規化・分割・仮想化は混ぜられた別分野の用語。
  • カプセル化=データと手続を一つにまとめて「隠蔽」。継承=上位の性質を「引き継ぐ」。
  • クラス=ひな形、インスタンス=作られた実体(1クラスから複数作れる)。「Aは種類Bの一つ(Aは具体的な1個)」ならインスタンスとクラスの関係。
  • 継承(汎化)は「〜は〜の一種」(is-a)。部品(part-of)や属性はサブクラスではない。
  • オーバライド=サブクラスでの再定義で、多相性を実現する手段。オーバロード=同じクラス内で引数違いの同名メソッド。
  • 委譲=内部で他のオブジェクトに処理を頼む。メッセージ=他のオブジェクトに動作を起こさせる。

ひっかけ

  • 部品をサブクラスに見せかける:エンジン・タイヤ・頭・アクセルは「〜の部品」なので継承ではない。「〜の一種」と言えるかで判定する。
  • オーバライドとオーバロードの取り違え:「再定義」ならオーバライド、「引数の型・個数・並び順が異なる」ならオーバロード。
  • 説明文の入れ替え:「隠蔽」はカプセル化、「受け継がせる」は継承、「共通性質を抽出して基底クラスを作る」は汎化。選択肢の説明を一つずつ用語に当てはめると消去できる。
  • クラスとインスタンスの逆転:「インスタンスがクラスの仕様を定義する」「1クラスにインスタンスは1つだけ」はどちらも誤り。インスタンス同士(中之島公園と代々木公園)やクラス同士(俸給生活者と公務員)の組も外す。
  • 継承の特徴を言い過ぎた選択肢:「基底クラスを変えてもサブクラスに影響しない」「基底クラスのデータは常に保護される」は誤り。正しいのは「追加・上書きする差分だけ書けばよい」。

用語(20)

オブジェクト おぶじぇくと(object)
データと、そのデータを扱う手続をひとまとめにした部品。
⚠ クラスから作られた実体を指すときはインスタンスと同じ意味。
クラス くらす(class)
同じ性質をもつオブジェクトに共通する属性と操作を定めた、ひな形となる定義。
⚠ インスタンスはクラスから作られた実体。クラスは1つ、インスタンスは複数作れる。
インスタンス いんすたんす(instance)
クラスの定義に基づいて作られた、具体的な1個の実体。
⚠ クラスと逆に覚えやすい。「代々木公園」のような固有の1個がインスタンス。
属性 ぞくせい(attribute)
オブジェクトが内部にもつデータ(性質の値)。
⚠ 属性はデータ、メソッドは手続。製造番号や住所は属性であってサブクラスではない。
メソッド めそっど(method)
オブジェクトがもつ手続(操作)で、メッセージを受けると実行される。
⚠ メッセージは実行を頼む側の働きかけ、メソッドは頼まれて実行される中身。
メッセージ めっせーじ(message)
他のオブジェクトにメソッドの実行を依頼し、動作を起こさせるもの。
⚠ オブジェクト内部のデータ(属性)や、オブジェクトを生成するひな形(クラス)とは別。
抽象化 ちゅうしょうか
細かい違いを捨てて、共通する本質的な性質だけを取り出すこと。
⚠ 「隠蔽」が出たらカプセル化。抽象化は「共通の性質を取り出して整理する」。
カプセル化 かぷせるか(encapsulation)
データと手続を一つのオブジェクトにまとめ、内部の詳細を外部から隠すこと。
⚠ 抽象化(共通部分を取り出す)や継承(引き継ぐ)と混同しやすい。キーワードは「隠蔽」。
継承 けいしょう(inheritance)
上位クラスの属性や操作を、下位クラスがそのまま引き継いで使えるしくみ。
⚠ 委譲は他のオブジェクトに処理を頼むしくみで、引き継ぎではない。
汎化 はんか(generalization)
複数のクラスに共通する性質をまとめて、上位クラスを作ること。
⚠ 逆向き(上位から特殊な下位クラスを作る)が特化。どちらも is-a の関係で、部品関係(集約)とは違う。
特化 とっか(specialization)
上位クラスをもとに、性質を追加した特殊な下位クラスを作ること。
⚠ 汎化の逆向き。
スーパクラス(基底クラス) すーぱくらす(superclass)/きていくらす
継承関係で、性質を引き継がせる側の上位クラス。
⚠ サブクラス(派生クラス)は引き継ぐ側。呼び名が複数あるだけで、同じものを指す。
サブクラス(派生クラス) さぶくらす(subclass)/はせいくらす
継承関係で、上位クラスの性質を引き継ぐ下位クラス。
⚠ 上位の「部品」はサブクラスではない。「〜の一種」と言えるものだけがサブクラス。
オーバライド おーばらいど(override)
スーパクラスで定義されたメソッドを、サブクラスで同じ名前のまま再定義すること。
⚠ オーバロードは同じクラス内に引数違いの同名メソッドを並べること。「再定義」ならオーバライド。
オーバロード おーばろーど(overload)
同じクラスの中に、名前が同じで引数の型・個数・並び順が違うメソッドを複数定義すること。
⚠ オーバライドはサブクラスでの再定義。キーワードは「引数が異なる」。
多相性 たそうせい(polymorphism:ポリモーフィズム)
同じ指示(インタフェース)で操作しても、相手のクラスに応じて異なる動作をする性質。
⚠ 多相性は「性質」、オーバライドはそれを実現する「手段」。
委譲 いじょう(delegation)
受けた操作を自分で処理せず、内部で他のオブジェクトに依頼するしくみ。
⚠ 継承(上位から引き継ぐ)や集約(部品を組み合わせて一つにする)と混同させられる。
集約 しゅうやく(aggregation)
複数のオブジェクトを部品として組み合わせ、全体と部分(part-of)の関係を作ること。
⚠ 継承(is-a)とは別の関係。集約では全体が部品の属性や操作を共有するわけではない。
コンポジション こんぽじしょん(composition)
部品が全体と一体で扱われる、結びつきの強い全体と部分の関係。
⚠ 多相性や継承の選択肢に紛れて出る。部品の組合せなので、継承とは別。
多重継承 たじゅうけいしょう
一つのサブクラスが、複数のスーパクラスから性質を引き継ぐこと。
⚠ 多相性に「特有のもの」ではない。多相性に特有なのはオーバライド。

このレッスンの過去問

このレッスンで稽古する