mainメソッド

これまでのプログラムには、暗黙のうちに次のようなものを書いていました。

public static void main(String[] args) {
    new FirstMethod().start();
}

気付いた方もいるかもしれませんが、これは名前が「main」で仮引数が「String[] args」であるようなメソッドの宣言です。講義で紹介しているメソッドよりもかなり複雑なので、ここまでの内容がだいたい分かった方はこのコラムに挑戦してみてください。

mainメソッド

これまでの説明では「プログラムはstartメソッドに書く」という紹介の仕方をしていましたが、プログラムの実行の裏側 ではそれよりも前に「public static void main(String[] args)」というメソッドが起動されています。このようなメソッドを「mainメソッド」と呼び、このメソッドが宣言されていないクラスは実行できません。

startメソッドの起動

mainメソッドの内部には、「new FirstMethod().start();」という命令を書いています。これは「new FirstMethod()」と「.start()」の2つに分割でき、前者は「FirstMethodクラスのインスタンスを生成する」ということを行っています。この「クラス」や「インスタンス」という仕組みについては、このコースの後半の「複合データ」で詳しく紹介する予定です。簡単に言えば、この「new FirstMethod()」という部分では「FirstMethodクラスの内容をコンピュータ上に実体化する 」ということを行っています。

後者の「.start()」というのは、「FirstMethodクラスに宣言したstartメソッドを起動する」というこれまでに紹介したメソッド起動と同じものです。左側に余計なものが付いているのは、「生成したインスタンス(コンピュータ上に実体化したもの)に属するstartメソッド」を起動しているためです。今回の授業では短い書き方でメソッドを起動していますが、これは「すでに実体化(インスタンス化)されたもののメソッド」を起動しているためで、その場合には「~.greeting()」というインスタンスの指定を省略して、単に「greeting()」と書けます。

public static

mainメソッドの宣言には、先頭に「public static」という「アクセス修飾子」を書いています。これは「誰がどのようにこのメソッドを起動できるか」ということを表したもので、前者の「public」は「誰でも起動できる」という意味を持っています。授業で紹介したメソッドはこのpublicを指定していないため、別のパッケージに作成したクラスからこれらのメソッドを起動できません。mainメソッドはプログラムを実行する際にコンピュータ から直接起動されるため、このような指定が必要です。

後者の「static」は「メソッドの起動にインスタンスが不要である」という指定です。このようなメソッドはインスタンスという実体がなくても直接起動できます。ただし、このようなメソッドは「オブジェクト指向プログラミング言語」に分類されるJavaの仕組みとしては非常に例外的です。今後の学習での余計な混乱を避けるため、このコースでは「static」をできるだけ使わないでもプログラミングができるように様々な注意を払っています。

これらのアクセス修飾子はこのコースでは詳しく説明しません。詳しくは後続のプログラミングに関するコースで紹介されると思います。

(String[] args)

最後に、仮引数宣言について少し見てみましょう。mainメソッドの仮引数には、String[]というStringの末尾に[]が付いた型が指定されています。これはこのコースの数回先で紹介する「配列型」というもので、「複数の文字列を1つの変数として取り扱うデータ構造」を表しています。この仮引数は「コマンドライン引数」とも呼ばれています。現在はプログラムを起動する際に「実行」とだけ選んでいますが、この実行する際にプログラムにいくつかの実引数を渡すことができます。ここで指定する引数は全て文字列で、いくつ指定しても、また一つも指定しなくてもかまいません。このように、場合によって個数が異なるような実引数を受け取るために、先ほどの「配列」という仕組みを使っています。

まとめ

以上のように、mainメソッドはプログラムを実行する際の起点となる非常に重要なメソッドですが、様々な難しい内容が使われています。世の中に出回っている参考書には、このmainメソッドの中に直接プログラムを書いて話を進めているものが多くあります。それらのプログラムをうまく動かせないと思ったら、「new <クラスの名前>().start();」のようにstartメソッドを起動して、startメソッドの中に命令を書いてやるといいと思います。

かなり難しい内容だったと思いますので、このコースの内容を習得したころに、もう一度読み返してみることをお勧めします。