【ITニュース解説】What Really Happens When You Write public static void main

2025年09月09日に「Medium」が公開したITニュース「What Really Happens When You Write public static void main」について初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

ITニュース概要

Javaでお決まりの「public static void main」はプログラムの入口。Javaの実行環境(JVM)が最初に呼び出すために必要な記述だ。「public」でどこからでも呼べるようにし、「static」でオブジェクト生成なしで実行可能にしている。各キーワードに重要な役割がある。

ITニュース解説

Javaプログラミングの学習を始めると、ほとんどの人が最初に「public static void main(String[] args)」という一行を目にする。これはプログラムを実行するための開始点となる部分であり、おまじないのように記述されることが多いが、この一行に含まれるそれぞれのキーワードには、Javaが動作するための明確で重要な意味が込められている。この決まり事を理解することは、Javaの基本的な構造を把握する上で非常に役立つ。ここでは、この一行を構成する各要素「public」「static」「void」「main」「(String[] args)」が、それぞれどのような役割を担っているのかを順に解説する。

まず、「public」はアクセス修飾子と呼ばれるキーワードの一つである。アクセス修飾子は、そのメソッドや変数がプログラムのどの範囲からアクセスできるかを制御する役割を持つ。「public」は最も広いアクセス範囲を示し、どのクラスからでもアクセス可能であることを意味する。mainメソッドがpublicでなければならない理由は、Javaプログラムを実行するJava仮想マシン(JVM)にある。JVMは、私たちが作成したプログラムの外部に存在するソフトウェアであり、プログラムの実行を開始するために、指定されたクラスのmainメソッドを呼び出す必要がある。もしmainメソッドがpublicでなければ、JVMは外部からこのメソッドにアクセスすることができず、プログラムを起動することができない。したがって、JVMという外部の実行環境に対して、プログラムの入口を公開するためにpublicが必須となる。

次に、「static」キーワードは、このメソッドがクラスに直接関連付けられていることを示す。Javaはオブジェクト指向言語であり、通常、クラスという設計図からインスタンス(オブジェクト)を生成し、そのインスタンスを通じてメソッドを呼び出す。しかし、プログラムが起動する時点では、まだどのクラスのインスタンスも生成されていない。JVMは、プログラムを開始するために、まずクラスをメモリに読み込むが、その段階で特定のインスタンスを作成することなく、直接プログラムの実行を開始できなければならない。「static」が付けられたメソッドは「静的メソッド」と呼ばれ、インスタンスを生成しなくても「クラス名.メソッド名」という形式で直接呼び出すことが可能になる。この仕組みにより、JVMはインスタンス化という手順を省略し、即座にmainメソッドを実行できる。もしmainメソッドにstaticが付いていなければ、JVMはどのインスタンスのmainメソッドを呼び出せばよいか判断できず、プログラムを開始できない。

「void」は、このメソッドが戻り値を持たないことを示すキーワードである。メソッドは通常、何らかの処理を実行した後に、その結果を値として呼び出し元に返すことができる。例えば、二つの数値を足し算するメソッドであれば、その計算結果を数値として返す。しかし、mainメソッドはプログラム全体の処理を開始する起点であり、その処理が終了するということは、プログラム全体の終了を意味する。mainメソッドを呼び出しているのはJVMだが、JVMはmainメソッドからの戻り値を受け取って何か特別な処理をすることはない。プログラムの実行が成功したか失敗したかといった終了ステータスをOSに伝えたい場合は、「System.exit(int status)」といった専用のメソッドを用いるのが一般的であり、mainメソッドの戻り値としては表現しない。そのため、mainメソッドは何も値を返す必要がなく、戻り値の型として「void」が指定される。

「main」は、このメソッドの名前である。Javaではメソッドに自由に名前を付けることができるが、「main」という名前は特別だ。JVMは、プログラムの実行を開始する際に、指定されたクラスの中から「public static void」という修飾子を持ち、「Stringの配列」を引数に取る、「main」という名前のメソッドを探すように設計されている。これは一種の規約であり、JVMがプログラムのエントリーポイント(入口)を一意に特定するための重要な目印となる。もしこの名前を「start」や「run」など別の名前に変更してしまうと、JVMはエントリーポイントを見つけることができず、「mainメソッドが見つかりません」というエラーを発生させてプログラムの実行に失敗する。

最後に、「(String[] args)」は、mainメソッドが受け取る引数を定義している部分である。これは、プログラムをコマンドラインから実行する際に、外部から情報を受け渡すための仕組みだ。「String[]」は「String(文字列)の配列」を意味し、「args」はその配列を格納するための変数名である。この変数名は「arguments(引数)」の略で慣習的に使われているが、他の有効な変数名に変更することも可能だ。「String[]」という型は変えられない。例えば、コマンドラインで「java MyProgram data1 data2」と入力してプログラムを実行した場合、「args」という配列には、要素として「"data1"」と「"data2"」という二つの文字列が格納される。プログラム内部では、この配列にアクセスすることで、実行時に与えられた情報を利用した処理を行うことができる。たとえプログラムがコマンドライン引数を必要としない場合でも、JVMが探すmainメソッドの形式がこの形であると定められているため、この引数の定義は省略することができない。

このように、「public static void main(String[] args)」という一見複雑な記述は、JavaプログラムがJVMという実行環境と連携し、正しく起動するための論理的なルールに基づいている。外部からアクセス可能にする「public」、インスタンス化なしで呼び出せるようにする「static」、戻り値がないことを示す「void」、JVMが探すための特別な名前である「main」、そしてコマンドラインからの情報を受け取るための「(String[] args)」。これらの要素が一つでも欠けたり、間違っていたりすると、プログラムは正常に開始されない。この一行に込められた意味を理解することは、Javaの根幹にある仕組みを把握し、より高度なプログラミングへと進むための重要な一歩となる。

【ITニュース解説】What Really Happens When You Write public static void main | いっしー@Webエンジニア