mainメソッドとクラスの関係
ではmainメソッドとクラスの関係について一度整理しておきましょう。
クラスを使ったプログラムの場合、クラスはあくまで設計図ですので、どこかでクラスを元にオブジェクトを作成して、オブジェクトに色々と指示をしてあげる必要があります。クラスのオブジェクトの作成は、別のクラスの中でも記述することは出来るのですが、その別のクラスのオブジェクトを作成する誰かが結局必要になります。つまり、まず最初にクラスとは関係無い誰かが最初に何かのクラスのオブジェクトを作成する必要があるわけです。
そこで使われるのがmainメソッドです。mainメソッドは『最初に呼ばれるメソッド』で記述した通り、プログラムを実行する時に最初に呼び出されるメソッドです。このメソッド内に他のクラスのオブジェクトを作成する記述をしておくことでプログラムは動作するわけです。
では前のページで使ったサンプルを見てください。
class ctest1{ public static void main(String args[]){ Television tv1 = new Television(); tv1.setChannel(1); tv1.dispChannel(); } } class Television{ int channelNo; void setChannel(int newChannelNo){ channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + channelNo + " です"); } }
mainメソッドもクラスの中に記述されています。本当は下記のように書ければ一番分かりやすいです。
public static void main(String args[]){ Television tv1 = new Television(); tv1.setChannel(1); tv1.dispChannel(); } class Television{ int channelNo; void setChannel(int newChannelNo){ channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + channelNo + " です"); } }
ただ上記のような書き方は、mainメソッドもメソッドの一種なので、メソッドはクラスの中にしか記述出来ないというルールがあり上記のような記述は行うことが出来ません。その為、特に使われないクラスを1つ用意してその中にmainメソッドを記述しているわけです。mainメソッドの外側にある「ctest1」というクラスは、誰もこのクラスを元にオブジェクトを作成していません。
このようにmainメソッドはある意味特殊なメソッドなわけなのですが、mainメソッドはどこかのクラスの中に記述してあればいいので、実は下記のように記述することができます。
class Television{ int channelNo; void setChannel(int newChannelNo){ channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + channelNo + " です"); } public static void main(String args[]){ Television tv1 = new Television(); tv1.setChannel(1); tv1.dispChannel(); } }
mainメソッドはどこかのクラスの中に記述されてあればいいわけですし、「ctest1」というクラスは実際に使っていないわけですから、「Television」というクラスだけを使い、その中にmainメソッドを書いてしまってもいいわけです。この場合、mainメソッドは「Television」クラスの中に記述されていますが、たまたまここに書いてあるだけで「Television」クラスとは何の関係もありません。
慣れてくればこのような書き方をした方が楽なのですが、この記述の方法だと「Television」クラスという設計図の中に、mainメソッドが含まれているクラスを元にオブジェクトを作成する記述があることなどから、混乱するかもしれないと思い別のクラスを1つ用意してmainメソッド書いてあります。
オブジェクト指向とmainメソッドの関係
ちなみにJavaプログラム入門では、実行したいプログラムの内容をmainメソッド内に全て書いていました。mainメソッドは最初から用意されているメソッドなので、誰かがオブジェクトを作成したりといったことをしなくても、その中に書いてある処理を実行することができます。
Javaは本来オブジェクト指向と呼ばれているプログラム言語です。オブジェクト指向と言うのは、目的に応じてクラスを設計して、そこからオブジェクトを作成し、そのオブジェクトに動作をさせる、といった記述方法を行うものです。mainメソッドではオブジェクトを作成したり、そのオブジェクトに対して動作を指示させるのが本来の利用方法なのですが、簡単な処理だけのプログラムでわざわざクラスを設計するまでもない場合に、mainメソッド内で行いたい処理を全部記述させてしまっていたわけです。
staticメソッドについて
mainメソッドが最初から存在しているメソッドであると書いてきましたが、これはプログラム内でわざわざ作成しなくても既に作成されているという意味になります。作成されなくても使えるわけではなく、プログラム開始時に何もしなくてもシステム側が作成してくれているということです。
このように明示的に作成しなくてもプログラム開始時に作成されているメソッドのことをstaticメソッドと呼びます。mainメソッドをよく見てください。
public static void main(String args[]){ Television tv1 = new Television(); tv1.setChannel(1); tv1.dispChannel(); }
メソッドの定義の際に、メソッド名を記述してある少し前の方に「static」という記述があることが分かると思います。この「static」という記述がある場合は、システム側でプログラム開始時に用意してくれるメソッドということになります。この「static」がついたメソッド内から他のメソッドを呼び出す場合には、その呼び出されるメソッドも「static」が付いている必要があります。その為、Javaプログラム入門で使っていたメソッドには全て「static」が付いていたはずです。
逆にクラスの中に記述され、いったんオブジェクトを作成されてから実行されるメソッドは、オブジェクトが作成された時点でメソッドが作成されればいいので、プログラム開始時から用意されている必要はありません。その為、「static」を付ける必要は無いわけです。
class Television{ int channelNo; void setChannel(int newChannelNo){ channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + channelNo + " です"); } }
staticメソッドやstaticクラスといったものは、厳密に言うと少し違うのですが、イメージとしてはここで書いたようなことです。また別のところで詳しく記述してみたいと思いますので、なんとなくそんな感じなんだと思っておいて頂ければ結構です。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。