テクノロジ編 PR

【応用情報】オブジェクト指向で出題されることをまとめた記事

記事内に商品プロモーションを含む場合があります

この記事ではオブジェクト指向についてIT初心者にも分かりやすく解説します。

オブジェクト指向

  • オブジェクト指向とは「モノ」に着目して設計する考え方。
  • オブジェクトには性質を示す属性と処理を示すメソッドがある。
  • オブジェクトの設計図をクラス、クラスから出来たモノをインスタンスと言う。
  • 上位クラスから下位クラスに属性やメソッドを引き継ぐことを継承と言う。
  • 継承したメソッドを再定義し直すことをオーバーライドと言う。
  • オーバーライドすることで同じメソッドで異なる処理ができ、これを多相性と言う。
  • 他クラスから属性やメソッドを引き継ぐことを委譲と言う。
  • 外部からオブジェクトの属性に直接アクセス出来ないようにして、メソッドを通して属性を変更するようにすることをカプセル化と言う。

応用情報ではオブジェクト指向に関する問題が出題されます。是非最後までご覧ください。

オブジェクト指向とは?

オブジェクト指向とは、JavaやC++のようなプログラミング言語で使われる考え方で、データ処理や操作では無く、「モノ」に着目して設計する考え方です。そもそも「モノ」とはなんでしょうか?

ゲーム開発を例に考えてみましょう。ゲームには「人間」・「武器」・「モンスター」等、様々な性質を持った「モノ」が登場します。これらのモノが歩く・攻撃する・回復する等の動作を行うことでゲームとして成立します。

このようにシステム全体をモノの集合体と捉え、個々のモノを作成しながら、モノに動作を与えていくような考え方がオブジェクト指向です。オブジェクト指向では「モノ」のことを「オブジェクト」と言います。

オブジェクトの性質 – データとメソッド

オブジェクトには名前や役職といったデータと、歩くやしゃべるといった処理が与えられています。オブジェクトに与えられた名前や役職等の性質をデータ(属性)と言い、歩くやしゃべる等の処理をメソッド(手続き)と言います。

オブジェクト指向のメリット – 同じモノを作成できる

オブジェクト指向の考え方とオブジェクトの性質について解説しましたが、オブジェクト指向でプログラムを作成することのメリットは何でしょうか?
オブジェクト指向では同じモノを容易に作成できます。

クラス・インスタンス

例えば、色々なキャラクターを操作出来る対戦ゲームを開発するとします。様々な性質を持ったキャラクターがいますが、矢印ボタンで歩いて、×ボタンで回避するのは共通です。

・勇者は矢印ボタンで歩いて、×ボタンで回避する
・僧侶は矢印ボタンで歩いて、×ボタンで回避する
・魔法使いは矢印ボタンで歩いて、×ボタンで回避する

と1つずつプログラムしても良いですが、かなり面倒臭いですよね。
なので、「人間」というオブジェクトを作成しておき、そこから派生して色々なキャラクターを作成します。

【「人間」は矢印ボタンで歩いて、×ボタンで回避する】
⇒ここから勇者・僧侶・魔法使いを作る。

こうしておけば、仮に開発途中に「〇ボタンでジャンプする」を追加しようとなっても、1つ1つのキャラクターに操作を追加するのではなく、「人間」だけに操作を追加すればOKになります。

オブジェクト指向では、「人間」のように設計図となるオブジェクトをクラス、「勇者・僧侶・魔法使い」のようにクラスから作られた、実際に動作するオブジェクトをインスタンスと言います。

「人間」には「勇者・僧侶・魔法使い」に共通する特徴を持たせておく必要があります。このようにインスタンスから共通の特徴を考えることを抽象化と言います。

継承・オーバーライド・多相性

継承

クラスとインスタンスの関係性は設計図と設計図から実際に作成されるモノの関係性と同じでした。ゲームの例で言うと、「人間」というクラス(設計図)から「勇者・僧侶・魔法使い」というインスタンス(実際にゲームに登場するキャラクター)が作られます。

同じように、上位の設計図から下位の設計図を作成することがあります。
ゲーム開発の例に戻りましょう。ゲームには「人間」以外に敵の「モンスター」や人間の味方をする「サポート」のキャラクターが登場します。人間・モンスター・サポート、それぞれに固有の特徴はありますが、HP・MPというデータを持ち、【攻撃を行う】というメソッドは共通の特徴で持つとしましょう。

この場合、下図のように「キャラクター」というクラスから「モンスター・人間・サポート」というクラスを作成し、そこからそれぞれのインスタンスを作成する方が楽です。このように上位のクラスから下位のクラスにデータやメソッドを引き継ぐことを「継承」と言います。また、上位のクラスをスーパークラス、下位のクラスをサブクラスと言います。

オーバーライド・多相性

スーパークラスからサブクラスにメソッドを継承する際、同じ関数で処理を変えることが出来ます。

スーパークラスの「キャラクター」から【攻撃を行う】メソッドを継承したサブクラス「モンスター・人間・サポート」ですが、それぞれ攻撃方法が異なるとしましょう。

モンスター:爪で攻撃する
人間   :拳で攻撃する
サポート :魔法で攻撃する

この場合、継承した【攻撃を行う】メソッドのコードを一部変更して再定義します。これをオーバーライドと言います。また、オーバーライドすることで同じメソッドの実行で異なる処理をさせることが出来ます。これを多相性と言います。

委譲

継承ではスーパークラスのデータやメソッドをサブクラスが全て引き継ぎましたが、他クラスのデータやメソッドを一部だけ引き継ぐことが出来ます。これを委譲と言います。

継承:スーパークラスのデータ・メソッドを全て引き継ぐ
委譲:他クラスのデータ・メソッドの一部を引き継ぐ

「サポート」クラスで【回復を行う】というメソッドを作成しましたが、「人間」クラスでも【回復を行う】メソッドを使うことにしました。この場合、「サポート」クラスで開発した【回復を行う】を「人間」クラスでも使えるようにします。これが委譲です。

【回復を行う】の開発は「サポート」クラスだけで行えば良いので、開発が楽になります。

オブジェクト指向のメリット – カプセル化

オブジェクト指向にはカプセル化という要素があります。
カプセル化とはオブジェクトが持つデータを外部から直接アクセス出来ないように隠し、データにアクセスする場合はメソッドを通すようにすることです。意味が分からないと思うので、先程のゲームを例に説明します。

「人間」クラスに「最大HP」と「現在のHP」というデータを持たせて、「勇者」を作りましょう。

まずはカプセル化されていないとどうなるか、を見てみます。
カプセル化されていない場合、勇者のデータである「現在のHP」を直接アクセス出来ることになります。なので、例えば勇者がHPを50回復する薬草を食べた場合、現在のHPは110になります。しかし、勇者の最大HPは100なので、これはおかしな結果ですね。

このように直接データを編集してしまうと整合性が取れない結果になってしまうことがあります。なので、次はデータをカプセル化してメソッドを通してデータに対して操作出来るようにしましょう

データをカプセル化しているので「現在のHP」を直接変更することが出来ません。その代わりに「HPを回復する」というメソッドを通して「現在のHP」を変更しています。これがカプセル化です。

カプセル化したデータはオブジェクトが持つメソッドを通すことでしかアクセス出来ないので、外部から与えられた処理を適切に制御した上でデータに変更を加えることが出来ます。このように、カプセル化ではデータとそれに対するメソッドを合わせて定義して1つにまとめます。こうすることで、開発者は「現在のHP」ってどうやって実装してるのか?を気にすることなく、単純に「HPを回復する」というメソッドを使えば良いということだけ知っていればOKになります。これもカプセル化のメリットですね。

応用情報技術者試験での出題例

令和6年度春期問45

応用情報技術者
午前試験 
令和6年度春期問45

オブジェクト指向におけるクラス間の関係のうち,適切なものはどれか。

ア クラス間の関連は,二つのクラス間でだけ定義できる。

イ サブクラスではスーパークラスの操作を再定義することができる。

ウ サブクラスのインスタンスが,スーパークラスで定義されている操作を実行するときは,スーパークラスのインスタンスに操作を依頼する。

エ 二つのクラスに集約の関係があるときには,集約オブジェクトは部分となるオブジェクトと,属性及び操作を共有する。

正解と解説

正解は”イ”

スーパークラスからサブクラスを継承するとき、継承したメソッドのコードを一部変更して再定義することが出来ます。これをオーバーライドと呼びます。よってイが正解です。

令和3年度秋期問48

応用情報技術者
午前試験 
令和3年度秋期問48

図は,ある図形描画ツールのクラス部の一部である。新たな形状や線種で図形を描画する機能の追加を容易にするために,リファクタリング”継承の分割”を行った。変更後のクラス図はどれか。

正解と解説

正解は”ウ”

問題の継承では、図形→三角形→太線の三角形、という風に2つの継承を行っています。
このような場合に、継承を2つに分けて、委譲を使ってデータやメソッドを引き継がせます。これを継承の分割と呼びます。

今回で言うと、【図形の種類】と【線の種類】で継承を分けることが出来そうですね。
そこから、太線の三角形を作りたい場合は線種のデータやメソッドを図形に引き継げば良さそうです。よって、答えはウとなります。