ここまで、Javaのクラスや継承、ポリモーフィズムやインタフェースについて説明してきました。
でも、ここまでの中で「オブジェクト指向」についてはまったく説明してきませんでした。
では、結局オブジェクト指向ってなんなんでしょう?
オブジェクト「指向」?
まず、意味が分かりづらい「指向」という言葉について見てみましょう。
「オブジェクト指向」は、英語で「object-oriented」と書きます。
「orient」は、「Encarta World English Dictionary」によると「~へと親しませるようにする」「~の方を向かせる」といった意味があります。「~の方へと肩を押す」といった感じでしょう。
また「object-oriented」と間にハイフンが付いているため、これは「主語 述語(過去形)」の関係ではなく、「名詞-過去分詞」の形容詞的な意味になります。
つまり「Object-oriented」は「オブジェクトへと向けられた」という形容詞ということになります。
となると、「オブジェクト指向」という言葉だけだとちょっと変です。
本来なら、「オブジェクト指向の○○」のように、何か掛かる言葉があるはずです。
そういう意味では「オブジェクト指向」という言葉だけ一人歩きしてしまった日本語訳はちょっと状況がおかしいとも言えます。
「オブジェクト指向プログラミング」
さて、ではこの「○○」には何が入るのでしょう。
実は色々な言葉入ります。
様々な「オブジェクト指向○○」があり、実は何が入るかによってだいぶ意味が異なります。
実はこれが問題で、この「○○」によって意味が違っちゃうので、単純に「オブジェクト指向」という言葉だけで考えると、とても多くの意味が生まれてしまいます。「オブジェクト指向」という言葉が分かりにくい原因のひとつがここにあります。
さて、ここまで説明してきた、Javaの各機能。
これは、Javaの「オブジェクト指向プログラミング」を説明したものです。
つまり、様々な意味を持つ「オブジェクト指向」の中でも、「プログラミング」についての説明をしてきたということです。
「オブジェクト指向プログラミング」は、先ほどの訳をもう少し分かりやすく使うと、「オブジェクトの方へと歩み寄ってプログラムを作ること」となります。
この「歩み寄る」というのは結構遠回りな感じですが、なぜこんな言い方をするかは後のページで説明します。
まぁ、これを乱暴に縮めて言えば「オブジェクト中心にプログラムを作る」となるでしょうか。
「オブジェクト」とは
では、「オブジェクト」とはなんでしょう。
それは「インスタンス」です。
「オブジェクト指向プログラミング」、特に「Java」のオブジェクト指向プログラミングでは、インスタンス=オブジェクト、と考えて構いません。
ということは、「オブジェクト指向プログラミング」は「インスタンス中心にプログラムを作る」ということになります。
え? 「プログラムを作る=クラスを作ることだからそんなの当然」だって?
はたしてそうでしょうか。
ここまで説明してきたように、クラスとインスタンスは別です。
クラスはあくまでインスタンスの設計図です。「オブジェクト指向プログラミング」とは、クラスではなく、クラスから作られるインスタンス中心にプログラムを作る、ということです。
そしてそれはポリモーフィズムやインタフェースへと継ながります。
ポリモーフィズムを使うと、参照型変数が指すインスタンスは、参照型変数の型のサブクラスであればどんな型でも使うことができました。
それはつまり、実際に処理をするインスタンスを問わない、ぶっちゃけて言えばインスタンス任せということです。
さらに、参照型変数の型がインタフェースなら、そのインタフェースを実装していればどんなインスタンスでも構いません。それこそ完全にインスタンス任せ、きっちりと仕事をしてくれさえすればいいんです。
これがオブジェクト指向プログラミングです。
オブジェクト指向プログラミングでは、オブジェクト同士の通信、具体的にはインスタンス同士がメソッドを呼び出しあうことで処理を行います。
その時、相手のインスタンスの型は気にしません。
メソッドを呼ぶことで「どういう結果がもたらされるか」は、メソッドごとの仕様で決められているはずです。
呼び出す側は、メソッドが仕様通り動くことだけを期待します。それが「どのインスタンスのどのメソッドでどのように処理されるか」は考えません。出自に関係なく、メソッドが期待通り動けばいいんです。
もし期待通り動かなかったら、それは相手のインスタンスが原因です。仕様を満たしていないわけですから、そのインスタンスを作ったクラスに問題があるわけです(もちろん呼び出す側がちゃんと仕様を満たしている場合)。
このようにオブジェクト指向プログラミングでは、各オブジェクトが独立しています。
そうすると、「問題の切り分けがしやすくなる」「クラス単位のテストが簡単にできる」「クラスの使い回しができる」といったメリットがでてきます。
オブジェクト指向プログラミングは、このようなメリットがあるため広まり、今は多くのプログラミング言語がオブジェクト指向プログラミングの機能を持っているわけです。