この記事ではオブジェクト指向について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になります。これもカプセル化のメリットですね。
基本情報技術者試験での出題例
サンプル問題問38
基本情報技術者
科目A サンプル問題問38
オブジェクト指向プログラムにおいて,データとメソッドを一つにまとめ,オブジェクトの実装の詳細をユーザーから見えなくすることを何と呼ぶか。
ア インスタンス イ カプセル化 ウ クラスタ化 エ 抽象化
正解は”イ”
カプセル化ではデータとメソッドを1つにまとめて定義します。
こうすることでユーザーはオブジェクトの実装の詳細を気にすることなく、メソッドを呼び出せばデータも変えることが出来ます。
気にする必要が無い実装はユーザーに見せません。間違えて触られることで不具合が発生するリスクを無くすためです。
平成30年度秋期問47
基本情報技術者
午前試験 平成30年度秋期問47
オブジェクト指向におけるクラスとインスタンスとの関係のうち,適切なものはどれか。
ア インスタンスはクラスの仕様を定義したものである。
イ クラスの定義に基づいてインスタンスが生成される。
ウ 一つのインスタンスに対して,複数のクラスが対応する。
エ 一つのクラスに対して,インスタンスはただ一つ存在する。
正解は”イ”
クラスは設計図、インスタンスはクラスから作成されるオブジェクトでした。
なので答えはイになります。
平成30年度秋期問49
基本情報技術者
午前試験 平成30年度秋期問49
オブジェクト指向における”委譲”に関する説明として,適切なものはどれか。
ア あるオブジェクトに対して操作を適用したとき,関連するオブジェクトに対してもその操作が自動的に適用される仕組み
イ あるオブジェクトに対する操作をその内部で他のオブジェクトに依頼する仕組み
ウ 下位のクラスが上位のクラスの属性や操作を引き継ぐ仕組み
エ 複数のオブジェクトを部分として用いて,新たな一つのオブジェクトを生成する仕組み
正解は”イ”
委譲とは他のオブジェクトで定義したメソッドを使うことでした。言い方によっては、他のオブジェクトにメソッドを依頼するとも言えますね。
平成30年度春期問46
基本情報技術者
午前試験 平成30年度春期問46
オブジェクト指向において,あるクラスの属性や機能がサブクラスで利用できることを何というか。
ア オーバーライド
ウ 継承
イ カプセル化
エ 多相性
正解は”ウ”
サブクラスに対して属性や機能を引き継ぐことを継承と言います。
オーバーライドは継承した機能を一部変更して使うことなので同じように使うことはしません。
平成29年度秋期問7
基本情報技術者
午前試験 平成29年度秋期問7
オブジェクト指向プログラミングにおける,多相性を実現するためのオーバーライドの説明はどれか。
ア オブジェクト内の詳細な仕様や構造を外部から隠蔽すること
イ スーパークラスで定義されたメソッドをサブクラスで再定義すること
ウ 同一クラス内に,メソッド名が同一で,引数の型,個数,並び順が異なる複数のメソッドを定義すること
エ 複数のクラスの共通する性質をまとめて,抽象化したクラスを作ること
正解は”イ”
オーバーライドはスーパークラスで定義されたメソッドをサブクラスで一部変更して再定義することでした。なので答えはイです。
平成29年度秋期問47
基本情報技術者
午前試験 平成29年度秋期問47
オブジェクト指向分析を用いてモデリングしたとき,クラスとオブジェクトの関係になる組みはどれか。
ア 公園,ぶらんこ
ウ 鉄棒,ぶらんこ
イ 公園,代々木公園
エ 中之島公園,代々木公園
正解は”イ”
設計図と設計図から作られる実際のモノ、の関係になっているものが答えになります。
代々木公園は公園から作られると考えられるので答えはイになります。
平成29年度春期問48
基本情報技術者
午前試験 平成29年度春期問48
オブジェクト指向の基本概念の組合せとして,適切なものはどれか。
ア 仮想化,構造化,投影,クラス
イ 具体化,構造化,連続,クラス
ウ 正規化,カプセル化,分割,クラス
エ 抽象化,カプセル化,継承,クラス
正解は”エ”
オブジェクト指向には「抽象化・カプセル化・継承・クラス」の4つの基本概念があります。
基本情報に関する他の記事
ハードウェア | ソフトウェア | システム構成 |
ネットワーク | データベース | 開発手法 | 情報セキュリティ |
開発手法に関する記事
プログラムについての記事
【基本情報】午前試験のアルゴリズムの苦手意識を克服する!
【基本情報】関数?手続?再帰的?プログラムの性質を解説!
データ構造についての記事
【基本情報】スタックとキューってなに?どこで使われている?
【基本情報】2分探索木を完全に理解する!
【基本情報】ハッシュ法を完全に理解する!過去問と一緒に解説!
開発の流れについての記事
【基本情報】アジャイルを完全に理解する!過去問と一緒に解説!
【基本情報】UMLやDFDの全てをまとめて解説!
【基本情報】モジュール結合度について分かりやすく解説!
【基本情報】オブジェクト指向で出題されることをまとめた!
【基本情報】基本情報で出題されるテスト手法の全てを解説