1-1: クラスとプログラムの構造

クラスとは何かを説明するため、 Javaのプログラムの中でクラスがどのような形で現れるのかを見てみましょう。 クラスの考え方を持たない Cなどの従来の言語と比較しながら解説します。


・ オブジェクト指向(Object Oriented)のプログラミングの特徴と、 オブジェクト指向プログラミングそのものを説明に入る前に、 従来のプログラムがどんな組立てになっていたかを簡単に復習しておきましょう。 ここでは(初期の)BASIC と C を例として見てみます。
たとえばディスプレイに "Welcome to Wakkanai Web!" というメッセージを表示させる プログラムを作りたいとします。 BASICであれば次のようなたった1行のプログラムで実現が可能です。 最近よく利用される perlでもほとんど同様です。


print "Welcome to Wakkanai Hokusei!"

ところが Cの場合は次のように多少付け加える必要が出てきます。 これは非常に有名なプログラムで、 C言語のプログラムの学習はここから始まります。


void main( int argc, char *argv[] ) {
 
      printf( "Welcome to Wakkanai Hokusei!\n" );
}
 

BASICのプログラムは、いわば「裸」の状態です。 実行したい命令(画面へのメッセージの表示)そのものしか記述する必要はありません。 Cの場合にはそれだけでは済まなくなります。 関数 main() という構造が登場します。 中括弧 "{" と "}" で囲まれた範囲が関数 main()の内部です。 関数という「入れ物」が用意され、 実行したい命令はその内部に記述されます。 関数の存在は慣れてしまえば当たり前のものです。 しかし初めて上のプログラムを見る人は、 なぜこのような形式が存在するのか疑問に思うかもしれません。 その理由を知るためには、 プログラムがもっと大規模になり、 何百行、何千行にものぼるような場合を考えてみる必要があります。
BASICのプログラムでは goto文を用いることで、 ある行からプログラム内のどんな場所へもジャンプすることができます。 これはちょっと考えると便利に思えるでしょう。 何か新しい必要が生じたら、すぐその場で付け加えることができるからです。 確かにプログラムの規模がきわめて小さい場合には問題はありません。 プログラム全体を把握することが可能だからです。 しかし、プログラムの規模が大きくなってくるとたちまち行き詰まります。 goto文を多用したプログラムは、 どの部分とどの部分が互いに関連し合っているのか見えにくくなりがちです。 十分注意をはらわないと、 いわゆる「スパゲティ・プログラム」と呼ばれるやっかいものになってしまいます。 結果として思いがけないバグが発生することになり、 修正の作業も大きな負担となります。 原因となる小さなミスを発見するために、 プログラムの隅から隅まで目を通さなければならないからです。
この事態を解決する手段として導入されたのが「構造化」と呼ばれる手法でした。 一連の手続きを「関数(もしくはサブルーチン)」という形式にまとめ、 さらに条件分岐や繰り返しなどの処理の適用範囲も 「ブロック」という構造にまとめます。 それらを階層的に組み立てる形でプログラムが記述されます。 Cの場合、プログラムの中で一番大きな構造は関数になります。 構造化の導入で原理的には goto文の追放が可能となりました。 Cにも goto文は存在しますが、ごく例外的な場面でしか用いられません。 また Cの goto文には、関数の外にはジャンプできないという強い制約があります。

・ さて、前置きが多少長くなりましたが、今度は Javaの場合を見てみましょう。 BASICやCのサンプルほど単純ではありません。 それは次のようになります。


public class Welcome {
 
       public static void main( String argv[] ) {
 
              System.out.println("Welcome to Wakkanai Hokusei!");
       } 
}
 

これまでの3つの言語のプログラムを比較すると、 なんとなく「言語の進化」のようなものが見えてくるでしょう。 ちょうど生物がアメーバのような単純な生物から、 しだいに複雑な構造をもつ高等なものに変化していくようですね。 Cでは最も大きな構造は関数でしたが、 Javaの場合には Cの関数に相当するもの(メソッドと呼ばれます)の外側に さらに大きな「入れ物」が存在しています。 この大きな構造が「クラス(class)」なのです。


プログラム言語の構造の進化