コンテンツにスキップ

4-2. 演習問題


1-1. クラスの説明として最も適切なのはどれか。

  • A. オブジェクトの設計図
  • B. 実際に画面へ表示された文字列そのもの
  • C. GitHub 上のリポジトリ名

1-2. カプセル化の主な目的として最も適切なのはどれか。

  • A. 内部状態を壊れにくくし、操作ルールをまとめる
  • B. すべてのコードを 1 ファイルに集める
  • C. for 文をなくす

1-3. 継承の説明として最も適切なのはどれか。

  • A. 共通部分を親クラスにまとめ、子クラスが引き継ぐ仕組み
  • B. 変数の型を自動で数値へ変換する仕組み
  • C. 例外を無視する仕組み

1-4. ポリモーフィズムの説明として最も適切なのはどれか。

  • A. 同じ操作名で呼び出しても、対象によって振る舞いが変わる
  • B. すべてのオブジェクトが同じ出力を返す
  • C. 変数名を複数用意すること

1-5. インスタンスの説明として最も適切なのはどれか。

  • A. クラスから作られた実際のオブジェクト
  • B. クラス定義そのもの
  • C. 条件分岐の別名

1-6. メソッドをクラスの中へ置く利点として最も適切なのはどれか。

  • A. そのデータに対応する処理だと分かりやすくなる
  • B. JavaScript を Git に変換できる
  • C. ログが必ず消える

次の文章の空欄を埋めてください。

  1. オブジェクトの設計図を (   ) という。
  2. 設計図から作られた実物を (   ) という。
  3. クラスの中に定義された関数を (   ) という。
  4. 内部状態を守りながら操作をまとめる考え方を (   ) という。
  5. 親クラスの共通部分を子クラスが引き継ぐ仕組みを (   ) という。
  6. 同じ操作名で対象ごとに振る舞いが変わる考え方を (   ) という。
解答欄

3-1. クラスとインスタンスの違いを説明してください。

解答欄

3-2. カプセル化がバグ防止に役立つ理由を説明してください。

解答欄

3-3. 継承とポリモーフィズムがどのようにつながっているか説明してください。

解答欄

3-4. オブジェクト指向でコードを整理すると、どのような場面で読みやすさや変更しやすさが増すか説明してください。

解答欄

ブラウザ上のプレイグラウンドで、小さなクラスを動かしてみましょう。

① プレイグラウンドを開く

下のコードはそのまま実行できます。必要に応じて書き換えながら試してください。

実行プレイグラウンド
編集内容は自動保存されます / Ctrl+Enter でも実行できます
出力
「実行」を押すと、ここに結果が表示されます。

② コードを確認する

  • CounterAnimalDogCat の 4 つのクラスがあることを確認する
  • counter.getCount()animal.speak() が最後に実行されることを確認する

③ 実行する

「実行」を押し、出力欄を確認する。

次のような表示が出れば成功:

2
Pochi barks
Tama meows
  • 最初に 2 が表示されることを確認する
  • Pochi barksTama meows が表示されることを確認する

④ コードを少し変える

※以下はそれぞれ別々に試し、1つ確認したら元のコードへ戻してから次を試す。

  • counter.increment(); を 1 回追加し、最初の表示がどう変わるか確認する
  • animals 配列へ new Dog("Hachi") を追加し、出力がどう増えるか確認する

counter.increment(); を 1 回追加した場合、次のように最初の表示が 3 へ変われば成功:

3
Pochi barks
Tama meows

animals 配列へ new Dog("Hachi") を追加した場合、次のように 1 行増えれば成功:

2
Pochi barks
Tama meows
Hachi barks

問題1の解答(クリックで開く)

1-1. 正解:A. オブジェクトの設計図

解説

  • A が正しい。クラスは、どのようなデータとメソッドを持つかを定義する設計図である。
  • B は誤り。表示された文字列は結果の一部であり、設計図ではない。
  • C は誤り。リポジトリは Git の概念である。

1-2. 正解:A. 内部状態を壊れにくくし、操作ルールをまとめる

解説

  • A が正しい。カプセル化は、データとその操作をまとめ、外から勝手に壊されにくくする考え方である。
  • B は誤り。1 ファイルに集めること自体が目的ではない。
  • C は誤り。for 文の有無とは無関係である。

カプセル化の本質は「隠すこと」ではなく、「ルールを守りやすくすること」である。


1-3. 正解:A. 共通部分を親クラスにまとめ、子クラスが引き継ぐ仕組み

解説

  • A が正しい。継承は、似た対象の共通部分をまとめるのに役立つ。
  • B は誤り。型変換の話ではない。
  • C は誤り。例外の無視は危険であり、継承とは無関係である。

1-4. 正解:A. 同じ操作名で呼び出しても、対象によって振る舞いが変わる

解説

  • A が正しい。ポリモーフィズムでは、呼び出し側は同じ speak() を呼ぶが、犬と猫で結果が変わる。
  • B は誤り。結果が同じである必要はない。
  • C は誤り。変数名の数とは関係がない。

1-5. 正解:A. クラスから作られた実際のオブジェクト

解説

  • A が正しい。インスタンスは設計図から作られた実物である。
  • B は誤り。クラスそのものは設計図側である。
  • C は誤り。条件分岐とは無関係である。

1-6. 正解:A. そのデータに対応する処理だと分かりやすくなる

解説

  • A が正しい。メソッドをクラスへまとめると、「この処理はこのデータに属する」と読み取りやすくなる。
  • B は誤り。Git 変換のような機能はない。
  • C は誤り。ログ削除とも関係がない。
問題2の解答(クリックで開く)
  1. クラス

オブジェクトの設計図である。どのデータとメソッドを持つかを定義する。

  1. インスタンス

クラスから作られた実物である。同じクラスから複数のインスタンスを作れる。

  1. メソッド

クラスの中へ定義された関数であり、そのオブジェクトに関する処理を表す。

  1. カプセル化

データと操作をまとめ、外部から不正に壊されにくくする考え方である。

  1. 継承

共通部分を親クラスから引き継ぐ仕組みである。似た対象を整理しやすくする。

  1. ポリモーフィズム

同じ操作名で呼び出しても、対象ごとに振る舞いを変えられる考え方である。

問題3の解答例(クリックで開く)

3-1. クラスとインスタンスの違い

クラスはオブジェクトの設計図であり、インスタンスはその設計図から作られた実物である。 たとえば Book がクラスなら、new Book("Git") で作られたものがインスタンスになる。 1 つのクラスから複数のインスタンスを作れる点が重要である。


3-2. カプセル化がバグ防止に役立つ理由

カプセル化によって、内部状態を自由に書き換えられないようにすると、不正な値が入りにくくなる。 たとえば残高を直接変更させず、deposit() のようなメソッドを通すと、負の金額を防ぐ検査を 1 か所へ集められる。 その結果、ルール違反によるバグを減らしやすくなる。


3-3. 継承とポリモーフィズムのつながり

継承を使うと、親クラスの共通構造を子クラスへ引き継げる。 そのうえで子クラスごとにメソッドの内容を変えると、呼び出し側は同じメソッド名で扱える。 この「同じ呼び出しで対象ごとに違う振る舞いが出る」ことがポリモーフィズムである。


3-4. オブジェクト指向で整理すると何が良いか

データと処理を近くに置けるため、「この処理は何に対するものか」が分かりやすくなる。 また、似た対象の共通部分をまとめやすく、変更にも強くなる。 機能が増えたときにコードの見通しを保ちやすいことが大きな利点である。

問題4の解答例(クリックで開く)

③ 実行結果の例

2
Pochi barks
Tama meows

counter.increment() を 2 回呼んでいるので、getCount() の結果は 2 になる。 Dogspeak()barksCatspeak()meows を出力する。 同じ animal.speak() でも対象ごとに振る舞いが変わる点がポリモーフィズムである。


以下は、④で元のコードから 1 か所ずつ別々に変更した場合の例である。


④-1. counter.increment(); を 1 回追加した場合

3
Pochi barks
Tama meows

カウンタの内部状態 #count が 1 増えるので、最初の表示が 3 になる。 ここでは値の更新が increment() というメソッド経由で行われており、これがカプセル化の考え方につながる。


④-2. new Dog("Hachi") を追加した場合

2
Pochi barks
Tama meows
Hachi barks

animals 配列に新しい犬インスタンスを追加したので、ループの中で speak() がもう 1 回呼ばれる。 呼び出し側のコードは変えずに、対象を増やすだけで振る舞いを広げられるのがオブジェクト指向の強みである。


コードの関係を図で見る

Counter
└─ #count を内部で管理
Animal
├─ Dog
└─ Cat
animals 配列
├─ Dog("Pochi")
└─ Cat("Tama")
同じ speak() を呼ぶ
結果は対象ごとに変わる

この図で、カプセル化・継承・ポリモーフィズムがどうつながるかを整理できる。