基本情報のオブジェクト指向を解説!継承・カプセル化・多態性の違い

設計図、自転車、硬貨箱、出力装置でオブジェクト指向の基本を表したイメージ

基本情報のオブジェクト指向で迷うのは、クラス、インスタンス、継承、カプセル化、多態性といった言葉が、どれも「プログラムを分かりやすくする仕組み」に見えるからです。定義を読んでも、選択肢で説明が入れ替わると判断しにくいですよね。

違いは、何を扱う仕組みかで整理できます。クラスは共通の定義、インスタンスはそこから作る実体です。カプセル化はデータと操作をまとめて内部へのアクセスを制御し、継承は親クラスの性質を子クラスへ受け継ぎ、多態性は共通の操作で相手に応じた振る舞いを実現します。

この記事では、用語を自転車や残高管理の例に結び付けて説明します。後半では、オーバーライドとの関係、生成した実体の追い方、選択肢を判定する自主例題まで確認します。プログラミング環境を用意せず、紙の上で理解を確かめられる内容です。

この記事のポイント
  • 共通の定義と個別の実体を区別できる
  • 内部を守る仕組みと性質を受け継ぐ仕組みが分かる
  • 多態性とオーバーライドの関係を具体例で理解できる
  • 生成・参照・操作の順に追って選択肢の根拠を説明できる
無料

基本情報技術者試験 過去問アプリ

本番形式で繰り返し解ける。スキマ時間に1問から

2,000問以上収録
無料で過去問を解く
目次

基本情報のオブジェクト指向の基本概念

同じ設計図をもとに作られた色の異なる3台の自転車を並べたイメージ

データと操作を一つにまとめる

オブジェクト指向は、データと、そのデータに関係する操作を、オブジェクトという単位で捉える考え方です。単に処理手順を並べるだけでなく、「何がどんな状態を持ち、何ができるか」を整理します。まずは、対象、状態、操作の三つを分けて考えましょう。

たとえば自転車なら、現在の速度やギアの段数は状態を表すデータです。加速する、ブレーキをかける、ギアを変えるという処理は操作です。自転車オブジェクトに加速を依頼すると、その自転車が保持する速度が変わる、という対応になります。

状態を表すデータは属性、操作を実装する処理はメソッドと呼ばれます。選択肢に「属性」とあれば保持している情報を探し、「メソッド」とあれば呼び出して実行する処理を探してください。同じ対象に関係するからといって、データと処理を同じ用語で扱わないことが大切です。

スクロールできます
見るもの自転車の例問題文での手がかり
対象個々の自転車どの実体を操作するか
属性速度・ギアの段数保持する・値を持つ
メソッド加速・減速・ギア変更呼び出す・実行する

「メッセージを送る」という説明も出てきます。オブジェクトに、公開された操作の実行を依頼するイメージです。ここでのメッセージは、必ずしもネットワークを流れる通信データではありません。別のオブジェクトのメソッドを呼ぶことを、やり取りとして表現しています。

Oracleのオブジェクトの公式解説でも、オブジェクトを状態と振る舞いのまとまりとして説明しています。実物の自転車だけでなく、会員、注文、予約など、目に見えない業務上の概念も対象にできます。

基本情報技術者試験では、オブジェクト指向を設計の考え方として押さえることが必要です。IPAのシラバスVer.9.2のオブジェクト指向設計には、クラス、インスタンス、属性、メソッド、カプセル化、継承、多相性などが用語例として挙げられています。

クラスとインスタンスを分ける

クラスは、どんな属性とメソッドを持つかを定める共通の定義です。インスタンスは、そのクラスに基づいて生成した個別の実体です。「設計図と、それを使って作ったもの」と考えると入口をつかみやすいですが、試験では、実体ごとに状態があることまで理解しておきましょう。

自転車クラスに速度とギアを定義し、そこから自転車Aと自転車Bを生成したとします。Aの速度が10、Bの速度が0でも、同じ自転車クラスのインスタンスであることに変わりはありません。属性の種類は共通でも、それぞれの属性値まで同じになるとは限らないのです。

共通の設計図と独立した2台の自転車でクラスとインスタンスを区別するイメージ

Aに対して加速メソッドを呼び、速度を5増やしたなら、Aの速度は15になります。この例ではBに操作していないので、Bは0のままです。「同じクラスだから、一方の変更でもう一方も変わる」という選択肢は、個別の実体と共通の定義を取り違えています。

ただし、すべてのデータが必ず実体ごとに独立するという断定も避けましょう。クラス全体で共有するデータや、複数の実体から同じものを参照する設計もあります。ここで独立しているのは、例の条件で各自転車が個別に持つ速度です。実際の問題では、何を共有すると書かれているかを確認します。

スクロールできます
用語役割混同しやすい説明
クラス属性とメソッドの共通定義個別の実体そのものではない
インスタンスクラスに基づいて生成する実体同じクラスでも状態は異なり得る
インスタンス化クラスから実体を生成すること変数名を付けることだけではない
コンストラクタ生成時の初期化に使う処理通常の操作を毎回実行するものではない

コンストラクタは、生成時に初期状態を整えるための処理です。たとえば自転車を生成するとき、初期速度を0、ギアを1に設定します。後からブレーキをかける処理は通常のメソッドであり、生成時の初期化とは役割が違います。

このように、クラスは実体の種類を定義し、コンストラクタは生成する実体の初期値を決め、メソッドは生成後の操作を担います。「定義する」「生成する」「初期化する」「操作する」の動詞を分けると、用語の入れ替えに気付きやすくなります。

クラス名、属性、操作を図で確認したい場合は、基本情報のUML図の見分け方が参考になります。ここでは図の記号よりも、共通の定義と個々の実体の違いを押さえてから先へ進んでください。

カプセル化は操作の窓口を決める

カプセル化は、関連するデータと操作を一つにまとめ、内部のデータや実装に対するアクセスを制御することです。外部には必要な操作の窓口を公開し、利用側が内部の細かな仕組みに依存しにくいようにします。単にデータを箱に入れるだけではなく、どの操作を許すかが要点です。

残高を管理するウォレットを考えてみましょう。外部から残高の数値を自由に書き換えられると、確認せずに負の残高へ変えたり、入金処理を通さずに金額を増やしたりできます。そこで残高そのものへの直接変更を制限し、入金、支払い、残高照会という操作を用意します。

支払いメソッドの中で、支払額が正の値か、残高が足りるかを確認する設計なら、利用側はそのメソッドを呼ぶことで条件に沿った変更を依頼できます。この例の「残高不足なら変更しない」というルールは、カプセル化という言葉だけで自動的に生まれるのではなく、内部の処理として実装するものです。

硬貨を囲った箱と操作用の窓口で内部データへの直接変更を防ぐイメージ

ここでカプセル化が提供するのは、ルールを確認する操作へ入口を集めやすくする仕組みです。公開する窓口の設計が不適切なら、カプセル化していても不正な状態を防げません。「カプセル化すれば、あらゆる不具合や情報漏えいがなくなる」という保証に読み替えないでください。

情報隠蔽は、利用側に不要な内部の構造や実装を見せず、依存させないという考え方です。基本的な用語問題では、カプセル化と関連付けて扱われます。残高を整数で持つか、別の形式で持つかを利用側が知らずに、同じ残高照会の窓口を使える状態を想像すると分かりやすいですね。

Javaの例では、内部フィールドをprivateにし、必要な操作をpublicのメソッドとして公開する形があります。Oracleのフィールドとアクセス制御の解説で確認できます。ただし、この記事では特定言語の修飾子を丸暗記するより、「直接変更できるか」「公開された操作を通すか」を判断軸にします。

試験の選択肢では、「内部を隠す」「外部には必要な操作だけを公開する」「実装の変更が利用側へ及ぶ影響を抑える」といった表現をカプセル化に結び付けます。一方、「親クラスの属性を子クラスへ受け継ぐ」は継承です。どちらも保守性に関係しますが、実現する仕組みが違います。

なお、外部から見えないことと、暗号化されていることは同じではありません。カプセル化はプログラムの設計やアクセスの扱いに関する概念です。データの秘密性を守る暗号化や利用者認証まで含むものとして選ぶと、説明の範囲を広げすぎてしまいます。

継承は共通部分を受け継ぐ

継承は、既存のクラスをもとに、新しいクラスへ属性やメソッドなどの性質を受け継ぐ仕組みです。もとになる側をスーパークラスや親クラス、受け継ぐ側をサブクラスや子クラスと呼びます。共通部分を利用しながら、子クラス固有の性質や処理を追加できます。

自転車を親クラスにして、山道用自転車と道路用自転車を子クラスにする例を考えます。速度を持つ、減速できるという共通の部分を自転車側に置き、山道用にはサスペンションの設定、道路用には専用の設定を加える構成です。子クラスを作るたび、共通部分をすべて書き直す必要がなくなります。

共通の構造を持つ標準自転車と山道用・道路用自転車を並べた継承のイメージ

関係を確かめるときは、「山道用自転車は自転車の一種である」と言えるかを見ます。このような関係をis-a関係と呼びます。反対に「自転車は車輪を持つ」は、部品を持つ関係です。自転車が車輪を使っているからといって、自転車が車輪の一種になるわけではありません。

スクロールできます
関係の説明例判断
AはBの一種である山道用自転車は自転車の一種継承を考える手がかり
AはBを持つ自転車は車輪を持つ継承と決め付けない
AはBの処理を利用する画面が計算部品に計算を依頼する利用関係だけでは継承ではない

ただし、is-aと読めれば無条件に適切な設計になるわけでもありません。子クラスを親クラスとして扱うとき、期待される操作の意味を保てるかも大切です。基本情報の入口では、まず「一種である」と「持っている」を区別し、問題文に指定された関係を根拠にしてください。

継承による再利用は、ソースコードをコピーして貼り付けることとは異なります。共通の定義を親側に置くので、同じ処理を各子クラスへ重複して記述するのを減らせます。ただし、親側の変更が子側へ影響することもあるため、「継承すれば変更の影響が絶対に生じない」は誤りです。

言語によって、継承できるメンバーやアクセスできる範囲には規則があります。たとえばJavaでは、親クラスのprivateメンバーは子クラスへ継承されません。用語の大まかな理解に、すべてのメンバーを自由に変更できるという意味を足さないことが大切です。

継承の基本はOracleの継承の解説、アクセス範囲などの規則はOracleのサブクラスの解説で確認できます。選択肢を読むときは「共通部分を受け継ぐ仕組みなのか」を最初に判定しましょう。

基本情報のオブジェクト指向問題の解き方

複数の部品と順序カードを並べて処理を追う学習イメージ

多態性は同じ操作で動作が変わる

ポリモーフィズムは、多態性や多相性と呼ばれます。共通の型や操作を使って扱いながら、実際のオブジェクトに応じた振る舞いを実現する考え方です。基本的な問題では、「同じ呼び出し」「異なる相手」「それぞれに合った処理」という対応を見つけると理解しやすくなります。

たとえば出力先を表す共通の型を用意し、紙に印刷する出力先と、画面に表示する出力先を扱うとします。利用側はどちらにも「出力する」と依頼しますが、紙の出力先は印刷し、画面の出力先は表示します。同じ操作名でも、依頼を受ける実体によって中の処理が変わるのです。

利用側が紙用の処理と画面用の処理を別々に呼ぶのではなく、共通の「出力する」を使う点に注目してください。共通の型として扱える仕組みと、個別の振る舞いがあるからこそ、利用側の呼び出しを共通にできます。単に二つの無関係な処理へ同じ名前を付けただけでは、ここでいう仕組みの説明として足りません。

継承は、親と子の間で性質を受け継ぐ仕組みです。多態性は、共通の操作に対して具体的な相手ごとに振る舞いが変わることに注目します。子クラスを定義することと、その子クラスの実体を共通の型で扱って呼び出すことを分けると、二つの違いが見えてきます。

たとえば、山道用と道路用がどちらも親の減速処理をそのまま使うだけなら、説明の中心は共通処理の継承です。一方、共通の説明表示メソッドを呼び出すと、山道用はサスペンション情報を、道路用は別の固有情報を示すなら、相手に応じた動作の違いを見られます。

Oracleの多態性の公式解説は、親クラスの型を持つ変数でも、参照している実体に対応するメソッドが呼び出される例を示しています。型の名前だけで結果を決めず、実際にどのクラスの実体を参照しているかを見るのがポイントです。

ただし、すべての同名メソッドが無条件にこの動きをするわけではありません。Javaのstaticメソッドなど、別の規則で扱われるものもあります。問題文の操作がインスタンスのメソッドなのか、どう定義されているのかを確認し、説明された条件の範囲で判断してください。

同じボタン操作から紙の印刷と画面表示が分かれる多態性のイメージ

オーバーライドと多重定義の違い

オーバーライドは、親クラスにあるメソッドを、子クラスで対応する定義により上書きすることです。多態性は振る舞いの特徴、オーバーライドはそれを実現するために使える仕組み、と役割を分けて覚えましょう。両者を完全に同じ意味の単語として扱わないことが大切です。

親の出力メソッドを、紙用の子クラスでは印刷処理として、画面用の子クラスでは表示処理としてオーバーライドすれば、共通の出力操作から、それぞれの実装を利用できます。まず定義の段階で子側の処理を用意し、その後、呼び出す段階で対象の実体に対応する処理が使われると考えます。

一方、オーバーロードは、同じ名前で引数の個数や型などが異なるメソッドを複数用意する仕組みです。「過負荷」や「多重定義」と呼ばれることもあります。表示するメソッドに、整数を渡す版と文字列を渡す版を用意する例なら、渡す引数の違いに注目します。

スクロールできます
用語どこを見るか例の手がかり
オーバーライド親と子の対応するメソッド子クラスで処理を上書きする
オーバーロード同名メソッドの引数の違い引数の個数や型が異なる
多態性共通の操作と具体的な実体相手に応じた振る舞いになる

Javaでは、戻り値の型が違うだけではオーバーロードできません。同じ名前、同じ引数の並びで、返す型だけを変えた定義を見て「別のメソッドだからよい」と判断しないでください。定義の条件はOracleのメソッドの解説に示されています。

名称が似ているため、「子クラスで上書きするのはオーバーロード」と取り違えやすいです。単語の響きで答えるのではなく、親子関係があるか、引数が違うかを先に探しましょう。どの特徴を説明しているのかが分かれば、似た名前の選択肢でも根拠を持って切り分けられます。

オーバーライドにも言語ごとの条件があります。この記事では、基本概念の違いを理解するために、引き継いだインスタンスメソッドを子側で実装し直す例を使っています。Javaの具体的な規則まで確認したい場合は、Oracleのオーバーライドの解説を参照してください。

Javaそのものをどこまで学ぶか迷う場合は、基本情報技術者試験にJavaは必要かで学習範囲を整理できます。ここでは特定言語の細かい文法より、定義の関係と呼び出し対象の違いを説明できることを優先しましょう。

生成と参照を追って答えを出す

処理の結果を問う問題では、用語の暗記だけでは答えを出せません。生成した実体、変数が参照する先、メソッドで変わる状態を順番に追います。まず実体ごとにA、Bと仮の印を付け、変数名と実体の印を別々に扱うと、途中で見失いにくくなります。

次の自主例を考えます。Counterクラスは整数のvalueを実体ごとに持ち、生成時に指定値で初期化します。add(n)は呼び出した実体のvalueへnを加える操作、get()は現在のvalueを返す操作です。下の表記は説明用で、IPAの正式な擬似言語の書式を再現したものではありません。

a ← 新しいCounterを生成(初期値2)
b ← 新しいCounterを生成(初期値5)
a.add(3)
b.add(1)
c ← aと同じ実体を参照
c.add(4)
a.get() と b.get() を確認する

最初の二行では、別々のCounterを生成します。実体Aは2、実体Bは5です。a.add(3)でAだけが5になり、b.add(1)でBだけが6になります。途中で両方が同じ5になる場面があっても、値が一致することと同じ実体を参照することは別です。

2つの容器と同じ容器を指す2本の指示棒で別の実体と共有参照を区別するイメージ
スクロールできます
処理後aの参照先bの参照先cの参照先AのvalueBのvalue
生成後AB未設定25
a.add(3)AB未設定55
b.add(1)AB未設定56
cにaの参照を設定ABA56
c.add(4)ABA96

cへ設定したのは、新しいCounterではなく、aと同じ実体への参照です。そのためc.add(4)はAを操作し、Aの値は5+4=9になります。最後のa.get()は9、b.get()は6です。cを通して操作しても、aが参照するAの状態が変わる点が、この例の確認ポイントです。

ここで「変数が三つあるから実体も三つ」と数えると間違えます。実体を新しく生成する処理は二回だけであり、cへ参照を設定した行では実体を追加していません。変数名はアクセスするための入口、実体は状態を持つ対象、と分けて数えましょう。

また、参照の設定と実体のコピーを同一視しないでください。この例では「同じ実体を参照」と条件を明記しています。問題にコピーや複製の操作が定義されていれば、その説明に従います。見慣れた代入記号だからという理由で、値や実体がどこまで複製されるかを決め付けないことが大切です。

Javaでも変数の宣言、実体の生成、初期化は区別され、複数の変数から同じ実体を参照できます。基本的な対応はOracleのオブジェクト生成の解説で確認できます。トレース中は、参照先を示す欄と実体の値を示す欄を分けておくと整理しやすいですね。

解く順番は、生成回数を数える、各変数の参照先を決める、呼び出した相手の属性だけを更新する、最後に求められた戻り値を読む、です。戻り値を読んだだけで状態が変わるかどうかも、メソッドの定義を確認してください。この例のget()は照会だけなので、値を変更しません。

選択肢は対象と動詞で見分ける

用語の選択肢は、説明の対象と動詞を分けて読みます。内部のデータを守るのか、親子間で性質を受け継ぐのか、共通の操作に対する振る舞いを変えるのか。この三つのどれを説明しているかを決めてから、用語名が一致するかを確認しましょう。

以下は理解を確かめるために作成した自主例題です。IPAの過去問を転載したものではありません。まず答えを見る前に、それぞれの説明の中で「何に対して何をしているか」を一文で言い直してみてください。

スクロールできます
自主例題選択肢判定
カプセル化の説明を選ぶア:子クラスへ共通処理を受け継ぐ
イ:内部データへの直接変更を制限し、公開操作を通す
ウ:同名メソッドを引数違いで用意する
正解はイ
継承の説明を選ぶア:共通のクラスから個別の実体を生成する
イ:内部実装を利用側から隠す
ウ:既存クラスの性質を子クラスへ受け継ぐ
正解はウ
多態性の説明を選ぶア:共通の出力操作で、紙用と画面用の実体が別々の処理を行う
イ:一つの実体のデータを何でも直接変更できる
ウ:複数の実体が必ず同じ属性値を持つ
正解はア
硬貨箱や自転車などの具体例と4枚のカードを照らし合わせる選択肢判定のイメージ

一つ目のアは継承、ウはオーバーロードです。イだけが内部データと公開操作の関係を説明しています。二つ目のアはインスタンス化、イは情報隠蔽に関係する説明です。ウが親子クラスの性質の受け渡しを示しているため、継承に対応します。

三つ目は、共通の操作と具体的な実体の違いがあるアを選びます。イはアクセスを制限する考え方と逆方向で、ウはクラスの共通定義と実体ごとの値を混同しています。正解の理由に加え、誤った選択肢を別の用語で説明できるかを確認すると、理解の抜けが見つかります。

次に、説明へ強い断定が加えられた場合も考えましょう。「カプセル化によって、利用側は内部の変更から必ず完全に影響を受けなくなる」は言いすぎです。公開操作の仕様を変えれば利用側に影響することがあります。仕組みの目的と、あらゆる条件での保証を分けて判断します。

「子クラスを変更するには、親クラスをすべて変更しなければならない」も、継承の定義ではありません。子固有の処理を追加するだけなら、親を変更しない場合があります。一方、「親の変更は子へ影響しない」と断定することもできません。どこを共有し、どこを個別に定義しているかで影響が変わります。

ひっかけを疑ってすべての強い言葉を機械的に消すのではなく、主張を成立させる条件が書かれているかを見ます。正式な言語仕様の説明なら、明確な規則として断定できる場面もあります。「必ず」という単語だけで判断せず、その範囲が問題文や定義と合っているかを確かめてください。

  • 主語がクラスか、個別のインスタンスかを確認する
  • 内部へのアクセス、性質の受け渡し、動作の違いを分ける
  • 共有する定義と個別の属性値を混同しない
  • 実体の生成、参照の設定、実体のコピーを区別する
  • 誤った選択肢は、対応する用語や不足条件まで説明する

基本情報のオブジェクト指向まとめ

基本情報のオブジェクト指向は、用語を別々に暗記するより、一つの対象について共通の定義、個別の状態、公開する操作、親子の関係、呼び出したときの振る舞いを分けると理解しやすくなります。クラスとインスタンスの違いを土台にして、三つの仕組みを整理しましょう。

スクロールできます
概念確認する問い覚える中心
クラスとインスタンス共通の定義か、個別の実体か同じ種類でも状態は異なり得る
カプセル化内部へどうアクセスするかデータと操作をまとめ、窓口を決める
継承親と子で何を受け継ぐか共通部分を利用して子を定義する
多態性共通操作でどんな処理が動くか具体的な実体に応じて振る舞う

今の理解を確かめるなら、自転車AとBを別々に生成してAだけを加速する例を説明し、その後、同じ出力操作を紙用と画面用へ依頼する例を説明してみてください。前者では個別の状態、後者では共通の操作と違う振る舞いを区別できるかが確認できます。

例題で手が止まった場合は、間違えた段階へ戻ります。実体の数が分からないなら生成と参照、用語が入れ替わるなら対象と動詞、呼び出し結果が違うなら実体のクラスとメソッドの定義を見直しましょう。正解番号を覚えるだけでは、名前や値を変えた問題に対応しにくくなります。

この分野を学習全体のどこに置くか迷う場合は、基本情報のテクノロジ系の勉強順で、開発技術とプログラミングの位置を確認できます。まずはこの記事の自主例題を、解説を隠してもう一度解き、選んだ根拠を自分の言葉で説明してみましょう。

用語の違いを確認できたら、基本情報の過去問アプリで無料演習し、選んだ根拠を説明できるか試してみましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次