公開日:8/2/2020  更新日:11/18/2020

  • twitter
  • facebook
  • line

【Java】public static void main (String [] args) の決まり文句を 分かりやすく解説

はじめに

本記事は、Java 初心者用の内容です。Java を学んでまず覚えなきゃいけない、main 関数の呪文を可能な限り優しく解説していきます。

お決まりの呪文 ~public static void main(String[] args)~

初学者が入門書を手に取り、まず必ず書かされるであろうコードを載せました。たいてい System.out.println() 以外のコードは気にしないで下さいといわれ、腑に落ちない状態になります(筆者談)。コードの一部を理解せずに前に進むのは、なかなか気持ち悪いものです。

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

main関数の修飾子を要素分解すると以下の表ようになります

要素 説明
public 外からアクセス可能
static インスタンス化せずに使用可能な
void 戻り値なし
main 関数の名前
String[] String 型の可変長配列
args 配列の名前 (他の名前でも可)

public

public はメソッドや変数につけることができ、アクセス修飾子といいます。他には、private や protected などあります。private や protected を設定すると、外部から直接 main 関数を参照実行できなくなってしまうので、public を必ず指定する必要があります。

static

staticが付くメソッドは staticメソッド、付かないメソッドは非staticメソッドと呼ばれます。非staticメソッドは、クラスをインスタンス化しないと実行不可能なメソッドです。インスタンス化はクラスを new クラス名() して実体化するやつです。main 関数は、クラスが new されず実行されるので static の記述が必ず必要になります。
※ 初心者はメソッドに public static を必ず付けろと言われる。なぜなら、クラスのインスタンス化をまだ習っていないから。

void

関数の返り値がないことを意味します。返り値があるとは、returnで文字型や整数型などの値を返すことです。サンプルプログラムは、System.out.println()の標準出力のみで、確かに返り値がありません。main 関数は返り値を必要としないので、voidを設定します。

main

関数の名前です。main関数は、Java のエントリーポイントと呼ばれており、プログラムの実行を開始する場所を指しています。関数の名前はmainでなければいけません。プログラムが main という名前の関数をエントリーポイントとして実行クラスから探すためです。

String[] args

Srrig[] は文字列を格納できる可変長配列です。可変長とは動的に配列に要素を追加できるもので、反対は固定長配列といいます。固定長だと、String[3] のように配列の要素数の上限を決めれます。argsは配列の名前です。引数を意味するarguments の略語ですね。argsでなくてもコードは動きますが、混乱の元なのでやめましょう。ところで、この配列はいつ出番が来るのか?というと、ターミナルやコマンドラインからjava コマンドを使って実行された際に活躍します。なので、main関数に記述される引数はコマンドライン引数と呼ばれます。初心者のうちは、Eqlipse などのIDE (統合開発環境) で自動コンパイル→実行するので、コマンドラインでjavaを実行したことがないと ?状態 かもしれませんね。JDK (Java Development Toolkit) をインストールすることでコマンドプロンプト上でjavaファイルをコンパイル→実行 することが出来ます。

コマンドライン引数

javac コマンドで hello.java ファイルをコンパイルして中間ファイルを作成します。すると hello.class が作られます。中間ファイルを java コマンドで実行します( .classは付けない)。また実行する際に、下記のように引数を設定できます。ここで設定した値が、先ほどのString[]型の配列argsに格納されます。引数を好きなだけ設定できるように、コマンドライン引数は可変長型に設定されています。
※ もしコマンドが見つからないと怒られた場合、環境変数にjdkのbinディレクトリを追加してください。

javac hello.java
java hello 引数1 引数2 ...

コマンドライン引数に格納された値は、下記のようにmain関数に記述したら受け取れます。

public class Hello {
    public static void main(String[] args) {
        System.out.println(args[0]);//一つ目の引数を出力
        System.out.println(args[1]);//二つ目の引数を出力
    }
}

さいごに

java は C言語やC++と同様にmain 関数がコードを実行する出発点となっています。一方で、Visual Basic や python, JavaScript などはコードを上から順番に実行していくのでエントリーポイントが存在しません。なので、Java 初心者は、エントリーポイントを明示的にプログラムに教えてあげるためのお作法をまず覚える羽目に陥ります。これも、Java が難しいと言われる要因の一つかもしれませんね。しかし、一度慣れてしまえばコードを読む側は main関数を探すことでコードの実行開始箇所を探せるので嬉しかったりします。

戻る