はじめに
私は12月ごろに大学の講義内でJava
を勉強し始めました。
しかし、いざ蓋を開けてみると、「とにかく早く課題を終わらせたい」という一心でコードを書いている自分がいました。そこで、今回はタイトルの通り、今までなんとなく記述していた「おまじない」について調べ、まとめました。
初歩的なものになってしまうと思いますが、参考になれば幸いです。
では、始めていきます。
「おまじない」とは?
私は普段Java
のコードを書き始める際、「なんとなくこれは書いておかないと」というマインドで以下のように書いてから中身を考えるようにしていました。
public sample {
public static void main(String[] args) {
//何かしらの処理を書き始める
}
}
そこで思ったのが、「Public static void main(String[] args)
って結局なに?」ということです。思い出してみると、「これは『おまじない』的なもので、今はまだ理解しなくても大丈夫」と言われていたような気がします。
紹介が遅れましたが、まさにこの部分が「おまじない」の正体です。
これについて一言でまとめると、Javaのmainメソッド
ですが、深掘りしていきます。
理解しやすくするために、このかたまりをとても細かくして、それぞれについて触れます。
public
?
mainメソッド
がpublic
であるのは単にそう決まっているからです。
また、補足ですが「public」の意味とほぼ同じでどこからでも参照できる的な意味合いをもっています。
static
?
「なぜstatic
を用いるのか」という議論と順番が逆になってしまっているような気がしますが、そもそもmainメソッド
は「インスタンスメソッド」ではダメです。
なぜならJava
には、「クラスの詳細を知らなくても、絶対確実にインスタンスを生成できる方法がJavaにはない」からです。
正直、私はこの文章だけでは「?」しかなかったので解説します。
ここでmainメソッド
の定義を振り返りましょう。
mainメソッド
はいわばプログラムを動かす際の「入口」となるもので、ここからJava
の処理は始まります。
最初に実行されるということは、mainメソッド
はJava Virtual Machine (JVM)
が直接呼び出すということになります。
もしmainメソッド
がインスタンスだった場合、クラスのインスタンスも必要です。
インスタンスメソッドを呼び出すためには、そのクラスのインスタンス(オブジェクト)を呼び出す必要があり、例えば以下のように記述する必要があります。
public class MyClass {
public void main(String[] args) {
System.out.println("Hello, World!");
}
}
また、これを動かす際は次のようにインスタンスを生成するコードが必要です。
MyClass obj = new MyClass();
obj.main(args);
しかし、JVM
はプログラムの実行開始時点で、このMyClass
をどのようにインスタンス化すればよいかを知らないため、実行に移ることは不可能です。
よって、「mainメソッド
はstaticメソッド
でないといけない」となります。
void
?
そもそもですが、「Public static void main(String[] args)
」においてvoid
は「戻り値」を表します。つまり、「戻り値はない」ということを表します。
「戻り値がない」ことを、例え話にして表してみます。
JVM
を「何かしらのイベント(会場)」mainメソッド
を「イベントの準備スタッフ」、スレッド
を「イベント参加者」というように考えてみましょう。
なんとなく、画像で表してみました。
mainメソッド
の開始は「イベントの準備の開始」を表し、イベントのために必要なものを集めます。例えば「イベント参加者に宣伝する(呼び出す)」などがあります。
さて、イベントが本格的に始まりました。参加者はそれぞれ独立して活動を始めます。もちろん、各自終わるタイミングも様々です。
ここで注意してほしいのは、「イベントの準備スタッフ」は準備作業が完全に終了したら帰宅する(終了する)という点です。しかし、参加者はまだ活動しているため、イベント全体は続いています。
全ての参加者が活動を終えたら、イベントも終了となります。
ここで、mainメソッド
に返り値があると、イベントを準備しただけでイベントが終了してしまい、せっかく呼び出された参加者がかわいそうになってきます。
だから、返り値を設定しないことで最後までJVM
を動かすことが可能になるということです。
よってvoid
と記述します。
main
?
(main
メソッドに「なぜmain
?」という問いは不毛にも感じますが解説します。)
main
という名がつけられるのは、Java
がC言語
の流れをくむプログラミング言語であるからだと考えられています。
私はC言語
を触ったことがないのでわからないですが、きっと経験者がなじみやすいよう決められたのでしょう。
String
?
この部分は「引数としてString
型の配列で受け取る」ということを表します。
どうやら、これもまたC言語
の仕様が基になっているようです。しかし、これにはれっきとした理由もあるのでそれについて説明します。
一言で表すと、「String
型は柔軟だから」です。
例えば、123
,abc
,3.14
はそれぞれ型が異なりますが、いずれも「文字列」であることに変わりはありません。つまり、全ての情報を扱うのに適した形式だということです。
また、あらかじめ「これはString
型だよ。」とmain
に統一して伝えておくことでJVM
がどのmain
を呼び出すのかを迷わないようにすることができます。
ただ、これは日々のプログラミングでも実感することがありますが、必要に応じて型変換の必要も生じてくるので、注意が必要です。
args
?
もう3度目になりますが、これまたC言語
の仕様が基になっているようです。
別にargs
ではなく、自分の好きな名前でも代用可です。
また、こちらもJava
を学習するさいに触れることですが、String[] args
は、プログラム起動時に指定する値(コマンドライン引数)を表します。
おわりに
今回の記事ではJava
の「おまじない」について解説しました。
今まで無心で書いていたコードの意味を知ることができたので、これから記述するときに毎回思い出すようにして記憶を定着させていこうと思います。
では、今回の記事はこれで終わりです。最後までお読みいただきありがとうございました。
参考