オブジェクト指向プログラミング(OOP: Object-Oriented Programming)は、現実世界の物体や概念をコンピュータ上で扱いやすい形にモデル化し、プログラムとして表現する手法です。OOPでは、「クラス」「オブジェクト」を基本単位として捉え、プログラムを組み立てていきます。これらの基本単位をどのように構築し、相互に関係づけるかを通じて、柔軟で再利用可能なソフトウェアを開発することを目指します。
以下に、オブジェクト指向の基礎となる5つの概念を解説します。
1. クラス(Class)とは何か?
クラスは、プログラムにおける「設計図」としての役割を果たします。クラスの定義には、そのオブジェクトが持つ属性(データ)とメソッド(操作や振る舞い)が含まれます。これを現実世界に例えると、クラスは「家の設計図」に相当し、そこには家のサイズや部屋数(属性)と、ドアを開ける、電気を点けるといった操作(メソッド)が記述されています。
クラスの主な役割は、以下の通りです:
オブジェクトの設計図として、複数のオブジェクトを生成するための共通の枠組みを提供する。
共通の特徴や操作を定義することで、オブジェクト間の一貫性と再利用性を担保する。
例えば、プログラムに「人間(Human)」というクラスを定義したとしましょう。このクラスには「名前」や「年齢」といった属性(フィールド)が定義され、また「話す」「歩く」といったメソッド(操作)が含まれます。この設計図を基に、具体的な「田中さん」や「佐藤さん」といったオブジェクトを生成できます。
2. オブジェクト(Object)とは何か?
オブジェクトは、クラスという設計図を基に作成された、具体的な実体です。クラスが抽象的な「概念」であるのに対し、オブジェクトはその概念が「現実世界に具現化されたもの」と捉えると理解しやすいでしょう。オブジェクトは、クラスで定義された属性とメソッドを持ち、それらを個別のデータや状態を用いて操作します。
例えば、「田中さん」というオブジェクトと「佐藤さん」というオブジェクトは、いずれも「人間(Human)」というクラスから生成されたものですが、それぞれ「名前」や「年齢」といった状態(属性)が異なり、異なる振る舞い(メソッドの実行)をします。
オブジェクトは以下の特性を持っています:
- 状態(State):オブジェクトの属性やフィールドが持つ現在の値。例:「年齢=30」
- 振る舞い(Behavior):オブジェクトが実行可能な操作やメソッド。例:「歩く()」
- 識別性(Identity):各オブジェクトは、同じクラスから生成されたとしても、それぞれ固有の存在として区別される。
これにより、オブジェクトはシステム全体の構成要素として協調しながら動作し、複雑な機能を実現することができます。
3. 継承(Inheritance)とは?
継承は、既存のクラスを基にして新しいクラスを作成する仕組みです。新しいクラスは、親クラス(基底クラス、スーパークラスとも呼ばれる)で定義された属性やメソッドをそのまま受け継ぎ、さらなる機能を追加したり、既存のメソッドを上書き(オーバーライド)して独自の動作を定義することができます。
この機能により、共通の処理を1つのクラスにまとめ、異なるクラス間でコードを再利用しやすくなります。例えば、「動物(Animal)」というクラスを基に「犬(Dog)」や「猫(Cat)」といったクラスを作成できます。「動物」というクラスが「食べる」「歩く」といった共通のメソッドを持っている場合、「犬」や「猫」のクラスもこれらのメソッドを継承し、そのまま利用できます。
- 親クラス(スーパークラス):共通の特徴を持つクラス(例:「動物」)。
- 子クラス(サブクラス):親クラスから継承され、さらに具体的な振る舞いや属性を追加するクラス(例:「犬」「猫」)。
継承のメリットは、コードの再利用性と構造の階層化にあります。これにより、複雑なシステムを階層構造で整理し、プログラムの可読性を向上させることができます。
4. ポリモーフィズム(Polymorphism)とは?
ポリモーフィズムは、「同じ操作(メソッド)が異なるクラスで異なる振る舞いを持つ」ことを指します。これにより、プログラムは一貫性を保ちながらも、オブジェクトごとに異なる処理を行うことが可能になります。
例えば、「動物(Animal)」という親クラスに「鳴く(speak)」というメソッドが定義されているとします。「犬(Dog)」クラスでは「ワンワン」と鳴くメソッドを、「猫(Cat)」クラスでは「ニャーニャー」と鳴くメソッドをそれぞれ定義することができます。これにより、「鳴く」という操作を行うコードは同じでも、実際の動作はオブジェクトによって異なる形で実行されるのです。
- メソッドのオーバーライド(Override):親クラスで定義されたメソッドを子クラスで上書きして、異なる動作をさせること。
- 多態性:異なるクラスのオブジェクトに対して、同じインターフェースを用いることができる柔軟性。
ポリモーフィズムを活用すると、共通のインターフェースやメソッド名を使って柔軟にオブジェクトの操作を行えるため、プログラムの拡張性が向上します。
5. カプセル化(Encapsulation)とは?
カプセル化は、データ(属性)とそのデータを操作するメソッドを1つのクラスの中にまとめ、外部からの不正なアクセスを防ぐことです。クラス内で定義されたデータ(フィールド)は、通常はprivateなどのアクセス修飾子によって外部から直接アクセスできないように保護され、そのデータを操作するためのメソッド(publicなどのアクセス修飾子を持つ)を通じてのみ操作が可能です。
これにより、以下の利点があります:
- データの保護:データを無秩序に変更されないようにする。
- 一貫性の確保:不正な値の代入を防ぎ、クラス内部の状態を常に一貫したものに保つ。
例えば、「銀行口座(BankAccount)」クラスでは、残高(balance)フィールドをprivateとして外部から直接変更されないようにし、入金や出金の操作をdepositやwithdrawというメソッドを通じて行うことで、データの整合性を守ります。
まとめ
オブジェクト指向プログラミングは、これら5つの基本概念を組み合わせることで現実世界の複雑なシステムを簡潔に表現し、保守しやすいコードを構築することを可能にしています。