オブジェクト指向プログラミングとは
オブジェクト指向プログラミング(OOP)は、プロパティと振る舞いを個別のオブジェクトにまとめることによってプログラムを構造化するプログラミングパラダイムです。これは手続き型プログラミングとは対照的で、データと手順が分離され、手順が直接データに作用することがありません。
OOPでは、各オブジェクトはクラスのインスタンスです。クラスは、このタイプの全てのオブジェクトに共通のプロパティ(データ)とメソッド(関数)を定義します。オブジェクトは、データとデータを操作する手順を両方ともカプセル化します。
OOPの基本的な概念
クラス
クラスは、オブジェクトが作成される原型またはプロトタイプです。コード内の概念を表し、このタイプの全てのオブジェクトに共通のプロパティ(データ)とメソッド(関数)が含まれます。
オブジェクト
オブジェクトはクラスのインスタンスです。データとデータを操作する手順の両方を含む、独立したエンティティです。
継承
継承は、1つのクラスが他のクラスからプロパティとメソッドを継承できる基本的な原則です。継承元のクラスは「親クラス」または「スーパークラス」と呼ばれ、継承するクラスは「子クラス」または「サブクラス」と呼ばれます。この関係は階層構造をもたらし、コードの再利用を促進します。
例えば、maker
、model
、color
というプロパティ、そしてstart()
、stop()
というメソッドを持つVehicle
クラスがあった場合、これらのプロパティとメソッドを継承し、追加のプロパティ(例えばドアの数)とメソッド(例えばopenTrunk()
)を持つCar
サブクラスを作成できます。
ポリモーフィズム
ポリモーフィズムは、異なるクラスのオブジェクトを共通のスーパークラスのオブジェクトとして扱えるようにする原則です。1つのインターフェースが一般的なアクションのクラスを表すことを可能にします。ポリモーフィズムには、コンパイル時の(または静的な)ポリモーフィズムとランタイム時の(または動的な)ポリモーフィズムの2種類があります。
コンパイル時のポリモーフィズムは、複数のメソッドが同じ名前を持ち、パラメータの数や型が異なる場合に達成されます。ランタイム時のポリモーフィズムは、サブクラスがスーパークラスで定義されたメソッドの特定の実装を提供することによって達成されます。
データの隠蔽とカプセル化
データの隠蔽は、ユーザーに必要なフィールドやメソッドだけを公開するソフトウェア開発技術です。これは複雑さを減らし、効率を高める方法です。カプセル化は、データとそのデータを操作するメソッドを束ねることに密接に関連しています。
これらの原則は、データが偶然破損するのを防ぎ、データがどのようにアクセスまたは変更されるかを制御する方法を提供します。つまり、ユーザーは、デザイナーが意図した方法でのみデータを操作できます。
抽象化
抽象化は、問題に適したクラスをモデル化し、問題の特定の側面に最適な継承レベルで作業することによって、複雑なシステムを単純化するプロセスです。これにより、問題ドメインが単純化され、コードの保守性と柔軟性が高まり、複雑さが減少します。
OOPでは、抽象化はクラスとインターフェースを通じて達成されます。クラスは、タスクの複雑さを隠蔽し、プログラミングのためのシンプルなインターフェースを提供します。例えば、start()
メソッドを持つCar
クラスがある場合、メソッドには多くの複雑なサブタスクが含まれているかもしれませんが、ユーザーはstart()
メソッドを呼び出すだけで済みます。
OOPの異なる言語での使用方法
Java
Javaは、静的型付けのオブジェクト指向言語であり、「一度書けばどこでも実行できる」という原則で設計されています。Javaでは、プリミティブ型((int, char, floatなど)を除く全てがオブジェクトです。Javaは、extends
キーワードを介して継承(inheritance)、public
、private
、protected
修飾子を介してカプセル化(encapsulation)、implements
とoverride
を介してポリモーフィズム(polymorphism)、抽象クラスとインターフェースを介して抽象化(abstraction)をサポートします。
C++
C++は、静的型付けの多パラダイム言語であり、手続き型、オブジェクト指向、およびジェネリックプログラミングをサポートしています。C++では、クラスを使用してオブジェクトを作成し、オブジェクトは互いにメッセージを送信して相互作用します。継承は:
演算子を使用して実装され、ポリモーフィズムは仮想関数を介して達成されます。カプセル化は、public
、private
、およびprotected
アクセス指定子を使用して実装されます。C++はJavaのようなインターフェースをサポートしていませんが、抽象クラスを介して同様の機能を実現することができます。
Python
Pythonは、手続き型、オブジェクト指向、関数型プログラミングを含む複数のプログラミングパラダイムをサポートする動的で高水準な言語です。Pythonでは、数値、文字列、関数を含む全てがオブジェクトです。Pythonは、全てのOOP原則をサポートしています。クラスはclass
キーワードを使って定義され、継承はクラス定義内でカッコを使って実装されます。カプセル化はJavaやC++のように強制されるわけではありませんが、属性やメソッドのプライバシーを示すアンダースコア接頭辞を使う規約があります。
JavaScript
JavaScriptは、主にWebインタラクティブ性の向上に使用される動的で高水準な言語です。最初は古典的なOOPを意図して設計されていませんでしたが、独自のプロトタイプベースのモデルと、より最近のバージョンではES6クラスを介してOOPをサポートすることができます。JavaScriptの継承のアプローチは、クラスではなくプロトタイプに基づいており、オブジェクトは直接他のオブジェクトから継承することができます。ES6はJavaScriptにclass
構文を導入し、JavaやC++などの他のOOP言語に文法的に近づけますが、その背後には依然としてプロトタイプベースのモデルがあります。