オブジェクト指向とは?基本情報技術者試験の頻出ポイントを解説

PCを触っている男性

オブジェクト指向は、現代的なプログラミングにおいては必須の知識です。

エンジニアの方やこれからエンジニアとなることを目指す方はもちろんのこと、IT業界に携わるうえではオブジェクト指向という考え方を理解しておくべきでしょう。

基本情報技術者試験では、オブジェクト指向の考え方について問われる問題が出題されます。この記事では、基本情報技術者試験の対策として、オブジェクト指向を理解できるようにオブジェクト指向の概要について解説します。

目次

オブジェクト指向とは

まず、以下ではオブジェクト指向の概要を解説します。

オブジェクト指向の概要

オブジェクト指向とは、プログラミングにおける考え方の一つで、プログラムにおいてすべてをオブジェクト(もの)として扱うことで、品質の高いソースコードを作成する方法のことです。

オブジェクト指向プログラミングにおいては、プログラム上のすべてのオブジェクトは「クラス」という単位で扱います。

例えば、車の動作について記述したプログラムであれば、Carクラスとして整理します。

クラスの中には、そのオブジェクトが所有するデータと、そのオブジェクトが行う処理について記述します。Carクラスであれば、大きさや最高速度、加速力や乗員定数、燃費などのデータを保有することになるでしょう。

また、Carクラスが行う処理としては、加速処理やブレーキ、ハンドル操作、ライトの点灯、ワイパーなどが考えられます。

プログラミングの世界では、Carクラスが持つデータをクラス変数(インスタンス変数、プロパティなどとも呼びます)として管理し、Carクラスが行う処理をクラスメソッド(もしくはクラス関数、インスタンスメソッドなどとも呼びます)として記述します。

オブジェクト指向プログラミングにおいては、例外なくすべてのプログラムをオブジェクトで管理します。

もし車を運転するプログラムを作るとしたら、CarクラスのほかにHumanクラスやRoadクラス、Signalクラスといったクラスを作成する必要があるでしょう。オブジェクト指向プログラミングでは、各クラスが他のクラスのメソッドを呼び出して相互に連携することでシステム全体での処理を実現します。

オブジェクト指向のメリット

少しややこしいオブジェクト指向の考え方ですが、なぜこのようなプログラミング手法を用いるのでしょうか。

それは、オブジェクト指向には多数のメリットがあるからです。

最も重要なオブジェクト指向のメリットは、生産性の向上です。オブジェクトとして各機能を整理することで、プログラムを再利用することができるようになります。

例えば、一度運転プログラムでCarクラスを作成してしまえば、その後ナビゲーションシステムを作る際にもCarクラスを流用できるでしょう。

これがオブジェクトの大きなメリットです。

もう一つのオブジェクト指向のメリットは、ソースコードの安全性が高まることです。オブジェクト指向のポイントは、オブジェクト内でデータに対する処理が完結することにあります。

上述したCarクラスであれば、車の操作に関する処理はすべてCarクラス内に記述されており、Carクラス内の処理によってのみCarクラスの持つデータは変更されます。

ですので、Carクラスが持つデータが他のクラスから勝手に書き換えられる心配がありません。

現代の開発においては複数人での開発が一般的です。その際に、勝手に他のクラスからCarクラスの内容を書き換えるようなコードを他の開発者が作成してしまったとしても、コンパイラが自動でエラーとしてくれます。

これにより、Carクラスの処理が意図通りにならないリスクを避けることができます。

このようなメリットから、現代プログラミングにおいては多くのケースにおいてオブジェクト指向が採用されています。プログラミングを行う際には、オブジェクト指向の理解は必須といえるでしょう。

オブジェクト指向の要素

以下では、オブジェクト指向を理解するうえで重要となるキーワードの解説を行います。

クラスとインスタンス

オブジェクト指向プログラミングでは、上述の通り各オブジェクトはクラスとして管理します。ただし、クラスはあくまで設計図であり、実際にプログラム処理中で利用するためには、クラスのインスタンス化と呼ばれる実体化処理を行います。

イメージとしては、クラスが金型であり、インスタンスは金型により作成された実物のようなものです。一般的に、プログラム上で利用するのはインスタンスが主となります。

インスタンスは、クラスで定義された変数のデータを保持します。

例えば、Carクラスからbusインスタンスを作成したとしたら、busインスタンスは大きさ10mで最高速度80km、乗車定員は30人といった変数の値を持つでしょう。一方で、Carクラスからtaxiインスタンスを作成したとしたら、taxiインスタンスは大きさ5mで最高速度は150km、乗車定員は5人などとなるはずです。

このようにして、一つのクラスから共通項目を持ちつつも別の機能を持った多数のインスタンスを作成できるのも、オブジェクト指向のメリットの一つです。

カプセル化

上述したオブジェクト指向のメリットの一つである安全性を実現するために、オブジェクト指向ではカプセル化と呼ばれる記述方法を採用しています。

カプセル化は、データとメソッドを一つのクラスにまとめて、他のクラスからアクセスできないようにすることを指します。

カプセル化により、オブジェクト内のコードを修正しても他のオブジェクトの処理に影響を与えないようにでき、クラス同士の独立性を高めます。

一方で、クラスを完全に独立としてしまっては他のクラスと相互に連携して処理を行うことができません。そこで、オブジェクト指向では主にメソッドのみを他のクラスから呼び出せるように設計します。

このようなメソッドをパブリックメソッドと呼びます。

例えば、Carクラスが持つ速度のデータをHumanクラスが勝手に操作することはできないようにします。もしCarクラスの速度を変更したい場合は、Carクラスのパブリックメソッドであるaccelerationメソッドを通して変更するようにします。

これにより、勝手に他のクラスがCarクラスの持つ速度を500kmなどといったありえない速度にしてしまうことを防ぎます。

汎化と特化

オブジェクト指向においては、どのような単位でクラスを作成していけばよいのでしょうか。クラス設計における考え方に、汎化と特化というものがあります。

汎化とは、クラスにおいて共通の機能をまとめて一つのクラスとすることです。これまでの例のように、様々な車を一つのクラスで扱うCarクラスは、汎化の具体例となります。

そのほかにも、いちごやみかんといった果物ごとにクラスを作成するのではなく、果物クラスとしてまとめたり、牛乳や水ではなく、飲み物クラスを作成したりするのが汎化のイメージとなります。

一方で、固有の機能に注目してクラスを分けることを特化といいます。

単一のCarクラスを作成する代わりに、BusクラスやTaxiクラス、Wagonクラスといったタイプ別のクラスを作成するのが汎化のイメージとなります。

汎化と特化は、それぞれにメリット・デメリットがあります。

汎化を行うことで、コード量が少なくなりプログラムのメンテナンス性も上がります。

一方でオブジェクトごとの違いを吸収するために、余計なコードを記述することになる可能性もあります。特化させることでオブジェクトの特性を十分に表すクラスとすることができますが、個別の要素ごとに特化をしてしまうとコード量が膨大となります。

ケースにより、両者を使い分けることが大切です。

継承

オブジェクト指向の設計技法のひとつに、継承というものがあります。

継承とは、既存のクラスを拡張することができるもので、既存のクラスにデータや機能を追加した新しいクラスを作ることができます。

例えば、Carクラスを拡張して、ErectricCarクラスを作ることを考えてみましょう。電気自動車であっても、操作方法や速度、乗車定員などのデータはこれまでの車と変わりません。その代わりに、充電機能やバッテリー要領といった新しい要素が追加されます。

継承を利用することで、Carクラスに電気自動車特有の機能を追加するだけで、新たなErectricCarクラスを作成することができます。

オーバーライド

継承において、既存のメソッドの内容を書き換えたり機能追加を行ったりすることをオーバーライドといいます。

上述した電気自動車の例において、Carクラスの既存機能では電気自動車の操作には適さないケースもあると思います。例えば、車の加速はエンジンで行いますが、電気自動車の加速はモーターを利用します。

このような場合に、Carクラスの既存機能であるaccelerationメソッドをErectricCarクラスで新たに書き換え、ErectricCarクラス独自のaccelerationメソッドを作成することができます。

オーバーロード

オーバーライドと似た概念に、オーバーロードというものがあります。オーバーロードとはオーバーライドとは異なり、継承とは関係ありません。

オーバーロードは、単一の名称で引数を変えた複数のメソッドを作成することをいいます。

例えば、同じaccelerationメソッドであったとしても、燃費重視で運転したいケースもあると思います。その場合に、accelerationメソッドの引数を変えて、エコモードレベルを追加したいとします。

このようなケースに、acceleration2などとメソッドの名称を変える必要はなく、引数だけ変えた同じaccelerationメソッドを作成することができます。

多様性(ポリモーフィズム)

多様性とは、オーバーライドやオーバーロードを活用し、同一の名称で複数の処理を可能にすることを言います。

上述の通り、オーバーライドやオーバーロードを用いることで、同一名称のメソッドを多数作成することができますが、これにより覚えなければならないメソッド名が減るというメリットがあります。

オーバーロードを用いない場合は、加速の方法により複数のメソッド名を指定しなければなりませんが、オーバーロードにより加速をしたい場合はaccelerationメソッドを利用するとさえ覚えておけばよくなります。これにより、プログラミングコストを下げることができます。

委譲(デリゲート)

委譲(デリゲート)とは、自身で処理を行うのではなく他のクラスに処理を任せることをいいます。クラスでは実施する処理の器だけを記載しておき、実際には他のクラスの中で処理を記述します。

デリゲートを用いることで、本来はクラス内で完結していた処理を他のクラスに任せることができます。一見すると、これは上述したカプセル化の概念に反するように見えるかもしれません。

しかし、あるクラスAの処理内容が他のクラスB、C、Dとの関係性が深い場合には、その処理をクラスAに記述してしまうことでクラスB、C、Dの修正に合わせて常にクラスAの修正が必要となります。こうなると、オブジェクト指向のメリットである独立性が損なわれてしまいます。

これを避けるために、他のクラスと関係が深いような処理を行う場合は、デリゲートを用いて他のクラスに処理を任せてしまったほうが、より安全性が高いコードとなるのです。

まとめ

この記事では、基本情報技術者試験を受けようとされている方に向けて、オブジェクト指向に関する基本的な内容の解説を行いました。

オブジェクト指向はエンジニアの方はもちろん、IT業界に携わるうえでは押さえておくべきキーワードとなります。非エンジニアの方であっても、オブジェクト指向の概念については最低限理解できるようにするとよいでしょう。

基本情報技術者コラム一覧へ戻る