PR

●はじめに

 C++をベースとして開発されたJavaは,完全なオブジェクト指向プログラミングを実現するオブジェクト指向型言語です。Javaでプログラミングするからには,オブジェクト指向プログラミングを避けて通ることはできません。ただし,オブジェクト指向プログラミングは,決して難しいことではありません。物作りの手法として,実に自然なことなのです。今回は,Javaのソース・コードを示し,オブジェクト指向プログラミングとは何かを説明しましょう。

●Javaプログラムはクラスの集合体として作成される

図1●Javaプログラムは,クラスの集合体として作成する
 123と456の加算結果を画面に表示するプログラムをJavaで記述すると,リスト1およびリスト2のようになります。リスト1は,Javaアプリケーション用のプログラムで,リスト2はJavaアプレット用のプログラムです。Javaプログラムの構文は,C言語やC++によく似ています。

 JavaアプリケーションとJavaアプレットのプログラムには,若干の違いがありますが,プログラムをクラスとして作成することは共通しています。Javaプログラムは,クラスの集合体として作成しなければならない約束になっているからです。どんなに規模の小さなプログラムであってもクラスにします。大規模なプログラムなら,数百~数千のクラスの集合体となるでしょう(図1[拡大表示])。

 リスト1では,“public class Sample1 {”から末尾の“}”までで,Sample1という名前の1個のクラスを定義しています。リスト2では,“public class Sample2 {”から末尾の“}”までで,Sample2という名前の1個のクラスを定義しています。プログラムの内容を隅々まで理解する必要はありません。クラスになっていることだけに注目してください。

 プログラムを構成する関数や変数は,必ず何らかのクラスに所属したものとなります。Javaでは,関数のことをメソッド,変数のことをフィールドと呼びます。Sample1には,main,AddNum,およびSystem.out.printlnという3つのメソッドと,xという1つのフィールドがあります。Sample2には,paint,AddNum,およびg.drawStringという3つのメソッドと,xという1つのフィールドがあります。

 メソッドには,Javaがクラス・ライブラリ(作成済みのクラスのセット)として提供しているものと,プログラマが独自に作成するものがあります。System.out.printlnとg.drawStringはクラス・ライブラリとして提供されているもので,AddNum,main,およびpaintは独自に作成したものです。

●オブジェクト指向設計とオブジェクト指向プログラミング

 プログラム開発の工程は,設計,プログラミング,およびテストの順に進められます。設計手法によってプログラミング・スタイルも決まります。オブジェクト指向プログラミングための設計手法を,オブジェクト指向設計と呼びます。

 オブジェクト指向設計では,プログラムの仕様書の中に示された「物」,すなわちオブジェクトを抽出し,オブジェクトの持つ動作(メソッド)と属性(フィールド)を決定していきます。これは,プログラムに要求される「機能」に注目していた従来のプログラミング・スタイルとの大きな違いです。

 オブジェクト指向設計やオブジェクト指向プログラミングは,決して難しいものではありません。一般的な物作りの手法をプログラミングに採用しただけです。例えば,自動車を作ることを考えてください。「前進,後退,右折,左折,変速」などの機能には注目しないでしょう。「シャーシ,ボディー,エンジン,ギア,タイヤ,ハンドル」などの「物」に注目するはずです。それと同じことをプログラミングでも行うだけです。ただし,目に見えないプログラムを「物」としてとらえるためには,発想の転換が必要かもしれません。

●基本はクラスの作成,必要に応じて継承,多様性,カプセル化を使う

 オブジェクト指向プログラミングの解説書を読むと,継承,多様性(多義性や多態性とも呼ばれる),およびカプセル化という言葉が必ず登場します。しかし,これらは,オブジェクト指向プログラミングを行うために使えば便利な機能であって,必ず使わなければならないというものではありません。オブジェクト指向プログラミングに不可欠となるのは,プログラムをクラスの集合体として作成することだけです。

図2●Appletクラスを継承してJavaアプレットを作成する
 手短に説明すれば,複数のクラスに共通した部分(メソッドやフィールド)を別のクラスにまとめ,それを他のクラスが再利用するのが継承です。似たような機能を持ったメソッドに同じ名前を付けるのが多様性です。フィールドをクラスの外部から直接読み書きできないように保護するのがカプセル化です。

 リスト2では,継承が使われています。public class Sample2 extends Appletの部分は,Sample2というクラスがAppletというクラスを継承することを示しています。extendsは,継承を表わすキーワードです。Appletクラスは,Javaのクラス・ライブラリが提供するクラスで,すべてのJavaアプレットに共通するメソッドやフィールドがまとめられています。Appletクラスを継承することで,簡単にJavaアプレットを作成できます(図2[拡大表示])。

●おわりに

 難しそうな概念に振り回されることなく,オブジェクト指向プログラミングをマスターするために重要なのは,オブジェクト指向プログラミングの目的を忘れないことです。オブジェクト指向プログラミングの目的とは,大規模で複雑なプログラムを整理して効率的に作成することです。クラスにまとめること,必要に応じて継承,多様性,およびカプセル化を使うことは,オブジェクト指向プログラミングの目的を達成するための手段です。その中でも基本となるのは,クラスにまとめることです。Javaでプログラミングすれば,必然的にクラスにまとめざるを得ないので,誰でも必ずオブジェクト指向プログラミングができます。次回は,Javaのクラス・ライブラリが提供する機能を紹介しましょう。