オブジェクト指向の基本(クラス・継承・多相性)
説明文を読んで、クラス・インスタンス・継承・カプセル化・多相性・オーバライド・委譲などの用語を選べるようになる。「〜は〜の一種」かどうかで、汎化(継承)の関係と、部分と全体の関係を見分けられるようになる。
オブジェクト指向は過去問で繰り返し出題されている。どの問題も説明文に合う用語を選ぶ形で計算はないので、用語の違いを押さえれば得点しやすい。
このレッスンで稽古する(用語チェック・過去問)結論:用語当てなので「説明文のキーワード→用語」を覚える
オブジェクト指向は、データと、そのデータを扱う手続をひとまとめにした部品(オブジェクト) を組み合わせてシステムを作る考え方。試験では「この説明は何という用語か」「この組合せは正しいか」という形で聞かれる。下の対応表を覚えれば、このレッスンの大半の問題は解ける。
| 説明文に出るキーワード | 用語 |
|---|---|
| データと手続を一つにまとめ、内部を外から隠す | カプセル化 |
| 共通の性質を取り出して整理する | 抽象化(クラス同士なら汎化) |
| 上位クラスの属性や操作を下位クラスが引き継ぐ | 継承 |
| 上位クラスのメソッドを下位クラスで再定義する | オーバライド |
| 同じクラスに、名前が同じで引数が違うメソッドを並べる | オーバロード |
| 同じ指示でも、相手のクラスによって動作が変わる | 多相性(ポリモーフィズム) |
| 受けた操作を内部で他のオブジェクトに依頼する | 委譲 |
| 他のオブジェクトに動作を起こさせる | メッセージ |
| クラスの定義から作られる実体 | インスタンス |
オブジェクト指向の基本概念は4つ
基本概念は 抽象化・カプセル化・継承・クラス の4つ。選択肢に 構造化・正規化・分割・仮想化 が混ざっていたら、それは別の分野の用語なので外す。構造化は構造化プログラミング、正規化はデータベースの用語である。
| 概念 | ひとことで | 見分け方 |
|---|---|---|
| 抽象化 | 細かい違いを捨てて、共通する性質だけを取り出す | 「共通の性質を取り出す」「整理する」 |
| カプセル化 | データと手続を一つにまとめて、中身を外から隠す | 「隠蔽」が出たらこれ |
| 継承 | 上位クラスの性質を下位クラスが引き継ぐ | 「受け継がせる」「利用できる」 |
| クラス | 同じ性質をもつオブジェクトをまとめた定義(ひな形) | 「定義」「ひな形」 |
カプセル化は、前のレッスンの 情報隠蔽(モジュールの中身を外に見せない)と同じ発想である。外からは決められた手続を通してしかデータを触れないので、中を直しても外への影響が小さい。API の中の実装を隠し、決めたエンドポイントだけを公開するのと同じ考え方だ。
クラスとインスタンス:設計図と、建てた家
クラスは設計図、インスタンスはその設計図から建てた一軒一軒の家にあたる。1枚の設計図から何軒でも家が建つように、1つのクラスからインスタンスはいくつでも作れる。インスタンスはオブジェクトとも呼ぶ。
| クラス | インスタンス(オブジェクト) | |
|---|---|---|
| 正体 | 同じ種類のものに共通する性質の定義 | 定義に基づいて作られた実体 |
| 例 | 公園、国、公務員 | 代々木公園、日本、私の父 |
| 数 | 1つ | 1クラスから複数作れる |
見分け方:「AはB(という種類)の一つ」と言えて、Aが固有名詞のような具体的な1個なら、AとBはインスタンスとクラスの関係である。
- 公園 と 代々木公園 → 代々木公園は公園の一つ → クラスとインスタンス
- 中之島公園 と 代々木公園 → どちらも具体的な1個 → インスタンス同士
- 公園 と ぶらんこ → ぶらんこは公園の部品 → 全体と部分
- 俸給生活者 と 公務員 → 公務員は俸給生活者の一種で、どちらも種類 → クラス同士(汎化)
汎化・特化(is-a)と、全体と部分(part-of)を見分ける
汎化は、複数のクラスの共通部分をまとめて上位クラスを作ること。逆に、上位クラスから特殊な下位クラスを作るのが特化である。汎化の関係は英語で is-a(〜は〜の一種)と呼び、継承はこの関係のクラス同士で起きる。
| 関係 | 確かめ方 | 例 | 継承か |
|---|---|---|---|
| 汎化・特化(is-a) | 「下は上の一種」と言える | 自動車←トラック、図形←三角形、哺乳類←人・犬・猫 | 継承する |
| 全体と部分(集約・part-of) | 「下は上の部品」と言える | 自動車←エンジン・タイヤ、人間←頭、会社←社員 | 継承しない |
| 属性 | 「下は上の項目・値」と言える | 自動車←製造番号、取引先←会社名・住所 | 継承しない |
上位クラスはスーパクラスまたは基底クラス、下位クラスはサブクラスまたは派生クラスと呼ぶ。名前が違うだけで、指しているものは同じだ。
継承とオーバライド:差分だけ書けばよい
継承を使うと、サブクラスには基底クラスにない追加分と、上書きする部分だけを書けばよい。ほかはすべて基底クラスから引き継ぐので、同じコードを何度も書かずに済む。サブクラスのインスタンスは、引き継いだ操作を自分で実行する(スーパクラスのインスタンスに頼むわけではない)。
そのかわり、基底クラスを変更するとサブクラスにも影響が出る。また、継承したデータが常にサブクラスから保護されるわけではない。
| 用語 | 何をするか | どこで |
|---|---|---|
| オーバライド(override=上書き) | スーパクラスのメソッドを、同じ名前のまま中身を再定義する | サブクラス |
| オーバロード(overload=多重定義) | 名前が同じで、引数の型・個数・並び順が違うメソッドを複数定義する | 同じクラスの中 |
「再定義」「上書き」ならオーバライド、「引数が違う」ならオーバロードと覚える。
多相性(ポリモーフィズム):同じ指示でも動作が変わる
多相性とは、異なるクラスのオブジェクトに**同じ指示(同じインタフェース)**を出しても、それぞれのクラスに合った動作をする性質のこと。たとえば「鳴け」と指示すると、犬のオブジェクトは「ワン」、猫のオブジェクトは「ニャー」と鳴く。呼び出す側は、相手が犬か猫かを気にしなくてよい。
多相性は、サブクラスごとにオーバライドすることで実現する。基底クラス「動物」の「鳴く」を、犬と猫のクラスがそれぞれ再定義しておくのである。そのため「多相性を実現するために特有のものは?」と聞かれたら、答えはオーバライドになる。
メッセージと委譲(出題は少ないので要点だけ)
メッセージは、他のオブジェクトに操作(メソッド)の実行を頼み、動作を起こさせるもの。オブジェクトが内部にもつデータ(属性)や、オブジェクトを作るひな形(クラス)とは違う。
委譲は、受けた操作を自分では処理せず、内部で他のオブジェクトに依頼する仕組み。上司が仕事を受けて部下に任せるイメージである。
| 用語 | 説明 |
|---|---|
| 委譲 | 受けた操作を、内部で他のオブジェクトに依頼する |
| 継承 | 下位クラスが上位クラスの属性・操作を引き継ぐ |
| 集約・コンポジション | 複数のオブジェクトを部品として組み合わせ、一つのオブジェクトを作る |
基底クラスと派生クラスの組を「〜は〜の一種」で選ぶ
ア “会社” と “社員”
イ “自動車” と “エンジン”
ウ “図形” と “三角形”
エ “人間” と “頭”
出典:基本情報技術者試験 科目A免除 修了試験 20251214 実施分 問35
解き方と答えを見る
- 基底クラスと派生クラスは、継承の関係(is-a=「派生は基底の一種」)だと確認する。
- 各選択肢の2つめを主語にして「〇〇は△△の一種」と読んでみる。
- ア「社員は会社の一種」→ おかしい。社員は会社に所属する人で、全体と部分(または関連)の関係。
- イ「エンジンは自動車の一種」→ おかしい。エンジンは自動車の部品(part-of)。
- ウ「三角形は図形の一種」→ 正しい。is-a が成り立つ。
- エ「頭は人間の一種」→ おかしい。頭は人間の体の一部(part-of)。
- is-a が成り立つのはウだけなので、ウが基底クラスと派生クラスの関係である。
答え:ウ(“図形” と “三角形”)。「〜の一種」と言えれば継承、「〜の部品」なら集約と判定する。
要点(試験直前に読む)
- 基本概念の4つ=抽象化・カプセル化・継承・クラス。構造化・正規化・分割・仮想化は混ぜられた別分野の用語。
- カプセル化=データと手続を一つにまとめて「隠蔽」。継承=上位の性質を「引き継ぐ」。
- クラス=ひな形、インスタンス=作られた実体(1クラスから複数作れる)。「Aは種類Bの一つ(Aは具体的な1個)」ならインスタンスとクラスの関係。
- 継承(汎化)は「〜は〜の一種」(is-a)。部品(part-of)や属性はサブクラスではない。
- オーバライド=サブクラスでの再定義で、多相性を実現する手段。オーバロード=同じクラス内で引数違いの同名メソッド。
- 委譲=内部で他のオブジェクトに処理を頼む。メッセージ=他のオブジェクトに動作を起こさせる。
ひっかけ
- 部品をサブクラスに見せかける:エンジン・タイヤ・頭・アクセルは「〜の部品」なので継承ではない。「〜の一種」と言えるかで判定する。
- オーバライドとオーバロードの取り違え:「再定義」ならオーバライド、「引数の型・個数・並び順が異なる」ならオーバロード。
- 説明文の入れ替え:「隠蔽」はカプセル化、「受け継がせる」は継承、「共通性質を抽出して基底クラスを作る」は汎化。選択肢の説明を一つずつ用語に当てはめると消去できる。
- クラスとインスタンスの逆転:「インスタンスがクラスの仕様を定義する」「1クラスにインスタンスは1つだけ」はどちらも誤り。インスタンス同士(中之島公園と代々木公園)やクラス同士(俸給生活者と公務員)の組も外す。
- 継承の特徴を言い過ぎた選択肢:「基底クラスを変えてもサブクラスに影響しない」「基底クラスのデータは常に保護される」は誤り。正しいのは「追加・上書きする差分だけ書けばよい」。
用語(20)
データと、そのデータを扱う手続をひとまとめにした部品。
⚠ クラスから作られた実体を指すときはインスタンスと同じ意味。
同じ性質をもつオブジェクトに共通する属性と操作を定めた、ひな形となる定義。
⚠ インスタンスはクラスから作られた実体。クラスは1つ、インスタンスは複数作れる。
クラスの定義に基づいて作られた、具体的な1個の実体。
⚠ クラスと逆に覚えやすい。「代々木公園」のような固有の1個がインスタンス。
オブジェクトが内部にもつデータ(性質の値)。
⚠ 属性はデータ、メソッドは手続。製造番号や住所は属性であってサブクラスではない。
オブジェクトがもつ手続(操作)で、メッセージを受けると実行される。
⚠ メッセージは実行を頼む側の働きかけ、メソッドは頼まれて実行される中身。
他のオブジェクトにメソッドの実行を依頼し、動作を起こさせるもの。
⚠ オブジェクト内部のデータ(属性)や、オブジェクトを生成するひな形(クラス)とは別。
細かい違いを捨てて、共通する本質的な性質だけを取り出すこと。
⚠ 「隠蔽」が出たらカプセル化。抽象化は「共通の性質を取り出して整理する」。
データと手続を一つのオブジェクトにまとめ、内部の詳細を外部から隠すこと。
⚠ 抽象化(共通部分を取り出す)や継承(引き継ぐ)と混同しやすい。キーワードは「隠蔽」。
上位クラスの属性や操作を、下位クラスがそのまま引き継いで使えるしくみ。
⚠ 委譲は他のオブジェクトに処理を頼むしくみで、引き継ぎではない。
複数のクラスに共通する性質をまとめて、上位クラスを作ること。
⚠ 逆向き(上位から特殊な下位クラスを作る)が特化。どちらも is-a の関係で、部品関係(集約)とは違う。
上位クラスをもとに、性質を追加した特殊な下位クラスを作ること。
⚠ 汎化の逆向き。
継承関係で、性質を引き継がせる側の上位クラス。
⚠ サブクラス(派生クラス)は引き継ぐ側。呼び名が複数あるだけで、同じものを指す。
継承関係で、上位クラスの性質を引き継ぐ下位クラス。
⚠ 上位の「部品」はサブクラスではない。「〜の一種」と言えるものだけがサブクラス。
スーパクラスで定義されたメソッドを、サブクラスで同じ名前のまま再定義すること。
⚠ オーバロードは同じクラス内に引数違いの同名メソッドを並べること。「再定義」ならオーバライド。
同じクラスの中に、名前が同じで引数の型・個数・並び順が違うメソッドを複数定義すること。
⚠ オーバライドはサブクラスでの再定義。キーワードは「引数が異なる」。
同じ指示(インタフェース)で操作しても、相手のクラスに応じて異なる動作をする性質。
⚠ 多相性は「性質」、オーバライドはそれを実現する「手段」。
受けた操作を自分で処理せず、内部で他のオブジェクトに依頼するしくみ。
⚠ 継承(上位から引き継ぐ)や集約(部品を組み合わせて一つにする)と混同させられる。
複数のオブジェクトを部品として組み合わせ、全体と部分(part-of)の関係を作ること。
⚠ 継承(is-a)とは別の関係。集約では全体が部品の属性や操作を共有するわけではない。
部品が全体と一体で扱われる、結びつきの強い全体と部分の関係。
⚠ 多相性や継承の選択肢に紛れて出る。部品の組合せなので、継承とは別。
一つのサブクラスが、複数のスーパクラスから性質を引き継ぐこと。
⚠ 多相性に「特有のもの」ではない。多相性に特有なのはオーバライド。
このレッスンの過去問
- オブジェクト指向の基本概念(抽象化・カプセル化・継承・クラス)平成30年度 春期 基本情報技術者試験 午前 問46
- クラスとインスタンスの関係平成30年度 秋期 基本情報技術者試験 午前 問47
- オブジェクト指向のメッセージの定義基本情報技術者試験 科目A免除 修了試験 20260726 実施分 問35
- 汎化・特化関係(is-a)によるサブクラス判定平成27年度 春期 基本情報技術者試験 午前 問48
- オブジェクト指向の継承とオーバライド平成29年度 秋期 基本情報技術者試験 午前 問7
- オブジェクト指向の多相性(ポリモーフィズム)令和7年度 基本情報技術者試験 科目A 公開問題 問12
- オブジェクト指向の委譲(delegation)平成30年度 秋期 基本情報技術者試験 午前 問49