前回までに,Java言語の特徴や,実際にJavaプログラムを書くために必要な約束ごと,つまりJavaの基本的な文法について説明しました。今回からは,Javaの特徴の1つであるオブジェクト指向について解説します。

オブジェクト指向とは

 オブジェクト指向とは何か?に対する答えは,人によってそのとらえ方は微妙に違っているため,こうであるという断定 はできません。もちろんオブジェクト指向を説明する書籍はたくさんあるので,機会があったら読み比べてみてください。プログラマからの視点や学者からの視点など,著者が考えるオブジェクト指向に対する微妙な考えの違いがわかると思います。

 ここでは,一般的にプログラミング言語で必要と思われるオブジェクト指向について説明をしていきます。ここ に書いてあることすべてを理解する必要はありません。特にJava言語では,「理想のオブジェクト指向」よりも,「矛盾しているが実益がある」方をとる場合がありますので,詳しいことは実際のプログラミングを学びながら,身に付けていくほうがいいでしょう。

オブジェクトとは

 「オブジェクト」を直訳すれば「もの」という意味になります。例えば,「パソコン」,これは「もの」です。つまり,「パソコン」を「パソコンオブジェクト」として考える訳です。 ところで「パソコン」は何でできているでしょうか?「キーボード」,「マウス」,「ディスプレイ」,「本体」…。挙げていけばきりがありません。しかし,ここで重要なのは,これらパソコンの部品も「オブジェクト」,つまり「もの」だということです。

オブジェクトは,オブジェクトによって作られている
(これは,オブジェクトの階層構造になっているとも考えられます)

 このように,オブジェクト指向では,オブジェクトを中心に物事を考えますが,オブジェクトの中には,形のないものも含まれます。例えば「 犬」というオブジェクトを考えてみましょう。 犬はどこにでもいますが,「犬」という種の「犬」はいません。もちろん「雑種」が種かどうかは別として,犬には「ブルドック」や「シェパード」といった種が存在し,「犬」とはそれらの総称です。しかし「私は,犬を飼っている」と言うことはできます。この場合,「犬」は,「どんな種類かはわからないけど,ワンワンほえる動物」というオブジェクト であることは理解できます。つまり「犬オブジェクト」は,「ブルドック」や「シェパード」を「抽象化したオブジェクト」と考えられるのです。

オブジェクトには,オブジェクトを抽象化したものも含まれる。

オブジェクトの属性

 同じ「犬」の仲間でも,「プードル」と「ブルドック」の違いはどこにあるでしょうか。体の大きさも違うでしょうが,もっとも違うのは,やはり毛並みでしょうか。プードルの毛は白く縮れていて,ブルドックの毛は,短く茶色や灰色をしています。このように,同じ犬オブジェクトの仲間でも「 毛」はそれぞれ特徴があり違っています。このような違いをオブジェクト指向では,「属性」で表します。つまりプードルの「毛」という属性は,「白くて縮れた毛」を表現していますし,ブルドックの「毛」の属性は「短くて灰色」という毛を表現しています。この場合,属性が表現するものは「毛並み」ですが,プログラミングでは「データ」 や「値」として表現します。

オブジェクトは,その存在に必要な属性を持っている。
属性は,「データ」,「値」で表す。

オブジェクトの機能

 オブジェクトは属性を持つといいましたが,オブジェクトが持つものに,もう1つ大切なものがあります。それは「機能」です。先ほどの「犬」 には「鳴く」という 機能があります。この機能を働かせると「ワン」という音声が発生します。「ワン」と鳴かない犬もいるでしょうが,オブジェクト指向的に考える場合は,犬オブジェクトには,ワンと鳴く機能はなくてはならないのです。つまり,以下のように考えられます。 つまり,オブジェクトは「属性」と「機能」という,2大要素で成り立っているのです。

オブジェクトは,オブジェクトの存在に必要な機能を持っている。

なぜ,オブジェクト指向なのか?

 ではなぜこのような考え方を「プログラミング」に応用する必要があったのでしょうか?その最大の理由は

過去のソースコードの再利用

です。

 プログラミング言語がオブジェクト指向を取り入れる以前から,プログラミングには「構造化」と呼ばれる手法が存在しました。この手法は,プログラムを意味や目的のある処理単位に分け,その処理単位で呼び出すことで,プログラミングの効率化を図ろうとしたものです。しかし,このような考え方には,大きな問題がありました。それは微妙に違う処理をたくさん用意したい場合,同じようなコードをもった処理がたくさん作られてしまうことでした。そこで,プログラムを「処理」という単位ではなく「オブジェクト」という単位でまとめることで,プログラムの独立性を高めて,他のプログラムにも応用しやすいようにと,考えたのです。

 なぜ,プログラムをオブジェクト単位で作ると,プログラムの独立性が向上するのか?といった問題は,他の言語との比較になるので,最初は深く知る必要はないでしょう。それよりも,Javaプログラムが作れるようになってから,他の言語と比較してみれば,オブジェクト指向プログラミングのすばらしさがより深く理解できると思います。

クラス

 Java言語にとって「クラス」ほど重要なキーワードはありません。なぜならJava言語はクラスによって成り立っているからです。そもそも「クラス」という言葉は「オブジェクト指向言語」で使われる言葉 なのですが,いったい「クラス」とは何なのでしょうか?

クラスとは?

 クラスを言葉で説明すると,いろいろな言い方ができます。例えば,

クラスは,オブジェクトの設計図である。
クラスは,インスタンスを生成するときの雛型になるものだ。
クラスは,プログラムをまとめる時のひとつの単位である。

などの説明ができます。どうでしょうか?この説明だけでクラスを理解できる人は少ないでしょう。そこで多少長くなりますが,次のようなたとえ話をしましょう。

 あなたは,人気のある彫刻家です。あなたの彫刻はいつもたくさんの人から注文がきます。そこで一度にたくさんの彫刻を作れないか考えました。まず,いつものように彫刻を彫り,オリジナルを作ります。これは世界に1つしかありません。そしてこの彫刻を使って型を取ります。型が出来上がったら中に樹脂を流し込み,同じような質感のコピーを作ります。見た目にはオリジナルとまったく同じです。この方法ならいくらでも同じ彫刻を作り出せます。

クラスは,インスタンスを生成するための雛形

 実は,この話の中に出てくるオリジナルの彫刻とその型が「クラス」なのです。そしてその型から出来上がったものを「インスタンス」と呼びます。

クラスとインスタンスとオブジェクトの関係

 先ほどの話では,クラスは彫刻の雛形として紹介していますが,オブジェクト指向の世界では,彫刻のようなものをオブジェクトとして考えるので,インスタンスとオブジェクト は同じように思われるかもしれませんが,一般的にクラスから作ったオブジェクトのことを「インスタンス」と呼びます。なぜなら,「オブジェクト」という言葉は,あまりにも意味が広く,クラスから作られたかどうかに関係なくすべて「オブジェクト」と呼ぶからです。しかし「インスタンス」と言った場合は,必ずクラスから作られたものなので,クラスから作られたオブジェクトを,インスタンスと呼ぶようにしているのです。さらに,厳密には,クラスからインスタンスを作ることを,「インスタンスの生成」といいます。

Java言語でクラスを定義する

 オブジェクト指向プログラミングでは,処理をオブジェクト単位で作っていきます。つまりどんなプログラムであろうと,必ずオブジェクトが必要になります。そしてプログラムで使用するオブジェクトは,クラスによって定義していきます。つまり,

Javaではクラスを作ることで,プログラムしていく

ということになります。そこで,もっとも単純なクラスの定義方法を説明します。

class MyClass {
}

このクラスの名前はMyClassです。クラスには名前がなければいけません。クラスを定義するときのもっとも重要なキーワードは「class」です。そしてその後ろに半角のスペースを1つ置いて,クラスの名前を書きます。さらに { と } を書きます。これは正しいクラスの定義ですが,大切なものが足りません。なぜなら,クラスは,インスタンスの雛形です。インスタンスはオブジェクトですから,オブジェクトには「属性」と「機能」が必要です。 そのため,Java言語では,クラスの属性を「インスタンス変数」で,機能は「メソッド」で実装する,と覚えておいてください。

 つまり,

クラスの属性はインスタンス変数,機能はメソッドで実現する。

ということです。