4-2. 演習問題
問題1:選択問題
Section titled “問題1:選択問題”1-1. クラスの説明として最も適切なのはどれか。
- A. オブジェクトの設計図
- B. 実際に画面へ表示された文字列そのもの
- C. GitHub 上のリポジトリ名
解答と解説
正解:A
- A が正しい。クラスは、どのようなデータとメソッドを持つかを定義する設計図である。
- B は誤り。表示された文字列は結果の一部であり、設計図ではない。
- C は誤り。リポジトリは Git の概念である。
1-2. カプセル化の主な目的として最も適切なのはどれか。
- A. 内部状態を壊れにくくし、操作ルールをまとめる
- B. すべてのコードを 1 ファイルに集める
- C. for 文をなくす
解答と解説
正解:A
- A が正しい。カプセル化は、データとその操作をまとめ、外から勝手に壊されにくくする考え方である。
- B は誤り。1 ファイルに集めること自体が目的ではない。
- C は誤り。for 文の有無とは無関係である。
カプセル化の本質は「隠すこと」ではなく、「ルールを守りやすくすること」である。
1-3. 継承の説明として最も適切なのはどれか。
- A. 共通部分を親クラスにまとめ、子クラスが引き継ぐ仕組み
- B. 変数の型を自動で数値へ変換する仕組み
- C. 例外を無視する仕組み
解答と解説
正解:A
- A が正しい。継承は、似た対象の共通部分をまとめるのに役立つ。
- B は誤り。型変換の話ではない。
- C は誤り。例外の無視は危険であり、継承とは無関係である。
1-4. ポリモーフィズムの説明として最も適切なのはどれか。
- A. 同じ操作名で呼び出しても、対象によって振る舞いが変わる
- B. すべてのオブジェクトが同じ出力を返す
- C. 変数名を複数用意すること
解答と解説
正解:A
- A が正しい。ポリモーフィズムでは、呼び出し側は同じ
speak()を呼ぶが、犬と猫で結果が変わる。 - B は誤り。結果が同じである必要はない。
- C は誤り。変数名の数とは関係がない。
1-5. インスタンスの説明として最も適切なのはどれか。
- A. クラスから作られた実際のオブジェクト
- B. クラス定義そのもの
- C. 条件分岐の別名
解答と解説
正解:A
- A が正しい。インスタンスは設計図から作られた実物である。
- B は誤り。クラスそのものは設計図側である。
- C は誤り。条件分岐とは無関係である。
1-6. メソッドをクラスの中へ置く利点として最も適切なのはどれか。
- A. そのデータに対応する処理だと分かりやすくなる
- B. JavaScript を Git に変換できる
- C. ログが必ず消える
解答と解説
正解:A
- A が正しい。メソッドをクラスへまとめると、「この処理はこのデータに属する」と読み取りやすくなる。
- B は誤り。Git 変換のような機能はない。
- C は誤り。ログ削除とも関係がない。
問題2:穴埋め問題
Section titled “問題2:穴埋め問題”次の文章の空欄を埋めてください。
- オブジェクトの設計図を ( ) という。
- 設計図から作られた実物を ( ) という。
- クラスの中に定義された関数を ( ) という。
- 内部状態を守りながら操作をまとめる考え方を ( ) という。
- 親クラスの共通部分を子クラスが引き継ぐ仕組みを ( ) という。
- 同じ操作名で対象ごとに振る舞いが変わる考え方を ( ) という。
解答と解説
- クラス
オブジェクトの設計図である。どのデータとメソッドを持つかを定義する。
- インスタンス
クラスから作られた実物である。同じクラスから複数のインスタンスを作れる。
- メソッド
クラスの中へ定義された関数であり、そのオブジェクトに関する処理を表す。
- カプセル化
データと操作をまとめ、外部から不正に壊されにくくする考え方である。
- 継承
共通部分を親クラスから引き継ぐ仕組みである。似た対象を整理しやすくする。
- ポリモーフィズム
同じ操作名で呼び出しても、対象ごとに振る舞いを変えられる考え方である。
問題3:記述問題
Section titled “問題3:記述問題”3-1. クラスとインスタンスの違いを説明してください。
解答と解説
クラスはオブジェクトの設計図であり、インスタンスはその設計図から作られた実物である。
たとえば Book がクラスなら、new Book("Git") で作られたものがインスタンスになる。
1 つのクラスから複数のインスタンスを作れる点が重要である。
3-2. カプセル化がバグ防止に役立つ理由を説明してください。
解答と解説
カプセル化によって、内部状態を自由に書き換えられないようにすると、不正な値が入りにくくなる。
たとえば残高を直接変更させず、deposit() のようなメソッドを通すと、負の金額を防ぐ検査を 1 か所へ集められる。
その結果、ルール違反によるバグを減らしやすくなる。
3-3. 継承とポリモーフィズムがどのようにつながっているか説明してください。
解答と解説
継承を使うと、親クラスの共通構造を子クラスへ引き継げる。 そのうえで子クラスごとにメソッドの内容を変えると、呼び出し側は同じメソッド名で扱える。 この「同じ呼び出しで対象ごとに違う振る舞いが出る」ことがポリモーフィズムである。
3-4. オブジェクト指向でコードを整理すると、どのような場面で読みやすさや変更しやすさが増すか説明してください。
解答と解説
データと処理を近くに置けるため、「この処理は何に対するものか」が分かりやすくなる。 また、似た対象の共通部分をまとめやすく、変更にも強くなる。 機能が増えたときにコードの見通しを保ちやすいことが大きな利点である。
問題4:ハンズオン
Section titled “問題4:ハンズオン”クラスのメソッドTODOを実装し、カプセル化・継承・ポリモーフィズムが動作することを確認せよ。
取り組む内容
Section titled “取り組む内容”Counter.increment()で#countを1増やす処理を実装するDog.speak()で"〇〇 barks"と出力するようAnimal.speak()をオーバーライドするCat.speak()で"〇〇 meows"と出力するようAnimal.speak()をオーバーライドする- 実行し、
counter.getCount()が2、各動物が正しい鳴き声を出すことを確認する
確認したいポイント
Section titled “確認したいポイント”#countが外から直接参照できない理由(カプセル化)DogとCatが同じanimal.speak()で呼ばれても異なる出力になる理由(ポリモーフィズム)animals配列にnew Dog("Hachi")を追加すると出力がどう増えるか
解答と解説
③ 実行結果の例
2Pochi barksTama meowscounter.increment() を 2 回呼んでいるので、getCount() の結果は 2 になる。
Dog の speak() は barks、Cat の speak() は meows を出力する。
同じ animal.speak() でも対象ごとに振る舞いが変わる点がポリモーフィズムである。
以下は、④で元のコードから 1 か所ずつ別々に変更した場合の例である。
④-1. counter.increment(); を 1 回追加した場合
3Pochi barksTama meowsカウンタの内部状態 #count が 1 増えるので、最初の表示が 3 になる。
ここでは値の更新が increment() というメソッド経由で行われており、これがカプセル化の考え方につながる。
④-2. new Dog("Hachi") を追加した場合
2Pochi barksTama meowsHachi barksanimals 配列に新しい犬インスタンスを追加したので、ループの中で speak() がもう 1 回呼ばれる。
呼び出し側のコードは変えずに、対象を増やすだけで振る舞いを広げられるのがオブジェクト指向の強みである。
コードの関係を図で見る
Counter └─ #count を内部で管理
Animal ├─ Dog └─ Cat
animals 配列 ├─ Dog("Pochi") └─ Cat("Tama") ↓ 同じ speak() を呼ぶ ↓ 結果は対象ごとに変わるこの図で、カプセル化・継承・ポリモーフィズムがどうつながるかを整理できる。