オブジェクト指向プログラミング(OOP)の概要
この記事では、オブジェクト指向プログラミング(略してOOP)の基礎概念を解説します。プログラミング初心者や、オブジェクト指向が難しいと感じている方のために、プログラミングより先に理解しておきたい点を網羅して解説します。
具体的には以下の点を学習し、オブジェクト指向プログラミングで超重要なポリモーフィズムが理解できることを目標としています。
- ・クラスとインスタンス
- ・カプセル化
- ・継承
- ・抽象クラスとインターフェース
- ・ポリモーフィズム(多態性)
今回はプログラムコードには触れず、オブジェクト指向プログラミングの概念だけを解説します。プログラミング言語によらない共通の考え方になります。
いくらオブジェクト指向言語でプログラミングができても、概念をしっかり理解して実践できていなければ、オブジェクト指向プログラミングとは言えません。まず、概念の理解を深めましょう。
実際のプログラムコードを含めた追加の解説は、後日、【実践編】として公開します。
オブジェクトとはデータとそれに関連する処理をまとめたもの
データ=属性(フィールド,プロパティ,メンバー変数)
属性は一般的にフィールドやプロパティ、メンバー変数などと呼ばれます。ただし、言語によってはフィールドとプロパティが区別されており、それぞれ別の意味を持ちます。ここでは混乱を避けるため、あえて属性と呼ぶことにします。
処理=操作(メソッド,メンバー関数、振る舞い)
操作は一般的にメソッドと呼ばれます。この呼び方はほぼ全ての言語で共通しているので、ここでも「メソッド」と呼ぶことにします。メソッドは属性を使用して計算等の処理を行うもので、オブジェクトが持つ関数です。通常の関数と同様に、引数をとることも、戻り値を返すこともできます。
オブジェクト指向プログラミングとは、オブジェクト単位でプログラミングを考えること
一言で表すと、データとそれに関連の強い処理を分離させず、1つのオブジェクトとして考えてプログラミングをすることがオブジェクト指向プログラミングです。
オブジェクトは、別のオブジェクトを使用してメソッドを呼び出したり、データを保持したりすることができます。このようにして、複数のオブジェクトを組み合わせてプログラムを作成していきます。
ただ、これを知っただけではオブジェクト指向プログラミングを理解したことにはなりません。次から、より詳しく解説していきます。
クラスとインスタンス
オブジェクトが持つ属性とメソッドを定義したものがクラス
属性は、クラスではその種類(名前と型)だけを決め、実際の値は持ちません。クラス内部では変数の宣言として扱われ、値を代入していない状態です。
メソッドは、引数と属性を参照して処理を行い処理結果を返すもので、処理中に属性値を変更することもできます。クラス内部では関数の定義として扱われ、処理内容も記述します。ただし、通常の関数とは異なり、クラスのメソッドを直接外部から呼び出すことはできません。次に説明するインスタンスを介して呼び出します。
クラスとは、オブジェクトがどういった性質を持つか決めたもの(オブジェクトの仕様)であり、プログラム内ではオブジェクトの型として扱われます。
※オブジェクトが常に一定の値を持つ場合は、定数として定義すれば値を持たせることができます。
※属性を全く参照しないメソッド(引数だけで戻り値が決まるメソッド)は、静的メソッドとして定義すれば、直接外部から呼び出すことができます。ただし、静的メソッドを安易に使用するべきではなく、使用する場面は限られます。オブジェクト指向プログラミングの理解が深まるまでは気にしなくてもいいでしょう。
クラスの属性に値を持たせ実体化したものがインスタンス
インスタンス(和訳すると「実体」)とは、クラスで決められた属性に具体的な値(データ)を持たせたものです。クラスはただの型であり、値を持ちません。使用するには、インスタンスを作成(インスタンス化)する必要があります。なぜなら、メソッドで参照する属性に値がなければ、処理ができないからです。
数学で例えると、「 X + 2」という式があったとします。これだけで計算の仕方はわかりますが、Xの値が決まらなければ計算できません。
「X = 3」とすれば答えは5、「X = 10」とすれば答えは12となります。「X」を属性、「X + 2」をメソッドに置き換えて考えると、「X = 3」とするのがインスタンス化です。そして「X = 3」のインスタンスでメソッドを実行すると、「5」という答えが返ります。
「長方形」というクラスを考えてみる
長方形の形を決める要素は何か?
「縦の長さ」と「横の長さ」で長方形の形はきまります。
この長方形の形を決める「縦の長さ」と「横の長さ」が属性となります。
長方形を使って何をしたいのか?
長方形を扱う人は、面積を知りたいとしましょう。
そこで、「面積を取得する」というメソッドを作ります。処理の内容は「縦の長さ × 横の長さ」を計算して返します。
これで長方形クラスができました。
また、オブジェクトが持つ属性やメソッドのことを総称してメンバーとも言います。長方形クラスなら、「縦の長さ」、「横の長さ」、「面積を取得する」の3つがメンバーです。
長方形クラスのインスタンスを考えてみる
長方形クラスの属性「縦の長さ」と「横の長さ」を決めれば良いです。例えば「縦の長さ = 5cm」、「横の長さ = 10cm」としましょう。
これで「長方形」という抽象的なものではなく、具体的に「縦が5cm、横が10cmの長方形」というはっきりした実体=インスタンスができました。必要な属性の値を決めるのがインスタンス化です。縦横の長さが決まれば、長方形の形も大きさも決まり、面積が求められます。
このインスタンスの「面積を取得する」というメソッドを呼び出すと、結果は「50cm」となります。
また、別の属性値を持つインスタンスも無数にできます。1つのクラスでも、異なる属性値を持つ複数のインスタンスが作成できます(同じ属性値でも可能)。メソッドの呼び出しはインスタンスに対して行うため、その実行結果もインスタンスによって変わります。
まとめ
-
クラスとは、オブジェクトのメンバーを定義した型。
-
インスタンスとは、クラスの属性に値を持たせて実体化したもの。
-
クラスはインスタンス化しなければ属性値を持たず、メソッドの実行もできない
-
メソッドはインスタンスで実行され、インスタンスによって実行結果が変わる。
メソッドの実行結果がインスタンスによって変わることは非常に重要なことです。これを認識していなければ、オブジェクト指向プログラミングへの理解を深めることはできません。
補足:オブジェクト≒インスタンス?
プログラミングにおいてオブジェクトという言葉は、インスタンスと同じ意味で扱われることが多いです。オブジェクトは日本語で「物」とか「対象」と訳されます。実体のある物として考えると「インスタンス」がまさにそれにあたるわけです。
オブジェクト指向の話の中では文脈によって意味合いが異なります。広い意味では、クラスも含めた抽象的な概念として扱われます。狭い意味では、具体的なインスタンスとして扱われます。
当記事では曖昧さを避けるため、「オブジェクト」という言葉は広い意味を表す場合のみ用います。狭い意味でのオブジェクトは「インスタンス」という言葉を用い、明確に区別して扱います。
この記事へのコメントはありません。